【问题标题】:Ember template not updating from arraycontrollerEmber 模板未从 arraycontroller 更新
【发布时间】:2014-01-04 14:58:06
【问题描述】:

在我的应用中,用户可以输入对朋友的描述或对已经存在的描述进行投票。两种方法(createDescription 和 upvoteDescription)都保留在数据库中。 upvoteDescription 更改 DOM,但 createDescription 不会。可能是因为我在模型中传递了一个参数,但我无法解决这个问题——api 需要它。

//descriptions route

App.DescriptionsRoute = Ember.Route.extend({
  ...
  model: function () {
    var store = this.get('store'),
        friend = this.modelFor('friend');
    return store.find('description', {friend_id: friend.id});
  }
})

//descriptions controller

App.DescriptionsController = Ember.ArrayController.extend({
  ...
  actions: {
    createDescription: function () {
      var name = this.get('name'),
          friend_id = this.get('controllers.friend').get('id'),
          store = this.get('store'),
          description = store.createRecord('description', {
            name: name,
            friend_id: friend_id
          });
      description.save();
    },
    upvoteDescription: function (description) {
      var count = description.get('count');
      description.set('count', count + 1);
      description.save();
    }
  }
});

//descriptions template

{{input value=name action="createDescription" type="text"}}

{{#each controller}}
    <div {{bind-attr data-name=name data-count=count }} {{action upvoteDescription this}}>
        <div>{{name}}</div>
        <span>{{count}}</span>
    </div>
{{/each}}

【问题讨论】:

    标签: ember.js ember-data handlebars.js


    【解决方案1】:

    find (by query) 不会主动确保它具有与查询匹配的记录,因此您必须手动将其注入结果中。

    createDescription: function () {
      var name = this.get('name'),
          friend_id = this.get('controllers.friend').get('id'),
          store = this.get('store'),
          description = store.createRecord('description', {
            name: name,
            friend_id: friend_id
          });
      description.save();
      this.pushObject(description);
    },
    

    或者您可以使用实时记录数组 (filter/all)

      model: function () {
        var store = this.get('store'),
            friend = this.modelFor('friend');
        store.find('description', {friend_id: friend.id});
        return store.filter('description', function(record){ 
           return record.get('friend_id') == friend.id;
        });
      }
    

    【讨论】:

    • 我尝试使用实时记录数组但无法正常工作,所以我采用了注入路线。稍作改动:this.get('content').pushObject(description);但除此之外效果很好。
    • @JonathanDayton 我也看到了这个。如果我的模型使用参数进行查找,则我的阵列控制器不同步。这仍然是您要使用的解决方案吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多