【问题标题】:Computed property with `@each` won't update带有“@each”的计算属性不会更新
【发布时间】:2014-07-21 10:11:09
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: ember.js


    【解决方案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')
    });
    

    请注意,在您的代码中,您正在创建 Ember Data 过滤器的多个实例,过滤器集合是指在存储中添加/删除记录时长期存在和更新的实时集合。您可能只想从 todos 中获取模型并对其进行过滤,而不是创建新的存储过滤器(这样也可以避免异步代码,这不是问题)。

    这是一个可以避免这种情况的实现(将其用作设置器没有意义,您只是从中获得):

      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

    【讨论】:

    • 您好 kingpin2k,感谢您的热情回复!我试图应用你的建议但失败了。这是我的尝试:jsbin.com/UDoPajA/215/edit?js,output 最糟糕的是,Ember 没有就问题提供任何反馈。你能修改我的小提琴来展示你的解决方案吗?如果您展示如何抓取和过滤模型,我也将不胜感激,这样我就不会使用昂贵的数据过滤器。 PS 可能的错字'todo.@each.id':不应该是 todos 吗?我尝试了任何一种方式,都不适合我。
    • 把它扔在答案里。
    • 我需要一个 setter,因为我使用 Ember Data 来检索记录列表。过滤器返回了一个承诺,我不得不使用the getter/setter trick 从承诺中提取值。有了你的更正,我不再需要那个了。谢谢你的帮助,kingpin2k!你能告诉我究竟是什么阻止了我试图引入你的更正的工作吗?
    • 是的,返回时值未定义(因为它是异步的),然后您返回的 otherTodos 在返回时也未定义。
    • 如果我别无选择,只能使用返回承诺的过滤器/查询,我如何将承诺中的值传递到 Ember.Select 视图中,而不破坏绑定?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-19
    • 2019-11-09
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 2018-06-12
    • 2019-12-08
    相关资源
    最近更新 更多