我创建了一个依赖于商店中所有记录的计算属性。
我尝试使用.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}}
)。
答案 0 :(得分:1)
您超出了该系列的范围。您需要访问todos
控制器才能拥有基于其模型的计算属性。 needs
将处理此用例。 http://emberjs.com/guides/controllers/dependencies-between-controllers/
此外,为了轻松访问todos控制器模型的别名,我们使用computed.alias
。 http://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