`@ each`的计算属性不会更新

时间:2014-05-31 22:41:11

标签: ember.js

我创建了一个依赖于商店中所有记录的计算属性。

我尝试使用.property('todos.@each.id').property('model.@each.id').property('@each.id').property('@each')和其他组合添加/删除记录时更新属性,到目前为止没有运气。 :(当我创建新记录时,现有的recrods'属性不会更新。

这是一个小提琴:http://jsbin.com/UDoPajA/211/edit?output

otherTodos控制器上的属性为Todo。该属性由页面上的<select>下拉列表使用(通过{{view Ember.Select}})。

1 个答案:

答案 0 :(得分:1)

您超出了该系列的范围。您需要访问todos控制器才能拥有基于其模型的计算属性。 needs将处理此用例。 http://emberjs.com/guides/controllers/dependencies-between-controllers/

此外,为了轻松访问todos控制器模型的别名,我们使用computed.aliashttp://emberjs.com/api/#method_computed_alias

Todos.TodoController = Ember.ObjectController.extend({
  needs:['todos'],
  todos: Ember.computed.alias('controllers.todos.model'),
  ....

  foo: function(){

  }.property('todos.@each.id')
});

PS注意事项,在您的代码中,您正在创建Ember数据过滤器的多个实例,过滤器集合应该是长期生存的实时集合,并在存储中添加/删除记录时进行更新。您可能只想从待办事项中获取模型并对其进行过滤,而不是创建新的存储过滤器(这样就可以避免异步代码,而不是那个问题)。

这是一个可以避免这种情况的实现(没有必要将它用作setter,你只能从中获取):

  otherTodos: function() {
    var model = this.get('model'),
      thisId = model.get('id');

      var todos = this.get('todos').filter(function (todo) {
        return todo.get('id') !== thisId;
      });
      var selectContent = todos.map( function(todo){
        var selectContent = {
          title: todo.get('title'),
          id: todo.get('id')
        };
        return selectContent;
      });

      return selectContent;

  }.property('todos.@each.id'),

这是您的代码的更新jsbin:http://jsbin.com/UDoPajA/216/edit

相关问题