【问题标题】:ComputedProperty doesn't get updatedComputedProperty 未更新
【发布时间】:2013-03-01 12:06:44
【问题描述】:

我有这个测试应用程序,它应该在每次单击应用程序视图时打印“已过滤”和“已更改”,因为调用了计算属性。但是,只有在使用空数组更新属性时才会触发属性绑定:

window.App = Ember.Application.create({
  Settings: Ember.Object.create({
    filter: []
  }),

  ApplicationView: Ember.View.extend({
    click: function(event) {
      filter = App.get('Settings.filter');
      console.dir(filter);
      if (App.get('Room.filtered')) {
        filter = filter.filter(function(item) {
          return item != App.get('Room.name');
        });
      } else {
        filter.push(App.get('Room.name'));
      }
      App.set('Settings.filter', filter);
    }
  })
});

Room = Ember.Object.extend({
 name: "test",
 _filterer: function() {
   console.dir("changed");
 }.observes('filtered'),
 filtered: function() {
   console.dir("filtered");
   filter = App.get('Settings.filter');
   for (var i = 0; i < filter.length; i++) {
     if (filter[i] == this.get('name')) return true;
   }
   return false;
 }.property('App.Settings.filter', 'name').volatile()
});

App.Room = Room.create();

setTimeout(function() {App.set('Settings.filter', ['test']); }, 3000);

这里是 jsbin:http://jsbin.com/edolol/2/edit

为什么只有将 Setting 设置为空数组时才触发属性绑定?以及为什么在超时手动执行时会触发?

更新

这是一个工作的 jsbin:http://jsbin.com/edolol/11/edit

【问题讨论】:

    标签: ember.js


    【解决方案1】:

    当您要从数组中添加/删除项,而不是更改整个数组时,您需要通知计算属性来观察数组中的项,而不仅仅是数组本身:

    语法是:

    function() {
    }.property('App.settings.filter.@each')
    

    它使用setTimeout 的原因是因为您要替换整个数组而不是其中的项目。

    我修复了你的 jsbin:http://jsbin.com/edolol/10/edit

    我修复了一些其他小问题,例如 filter.push 现在是 filter.pushObject(使用 Ember 的 MutableArray)。

    更改过滤器数组(filter = filter.filter())后,您需要将新的filter 变量设置为属性:App.set('Settings.filter', filter);

    【讨论】:

    • 从 [] 到 MutableArray 的转换是自动发生的吗? .@each 的东西如果没有你的小修改将无法工作(你可以看到你是否从 jsbin 的修订版 3 循环到 9)。
    • 是的,Ember 会自动将所有数组转换为 MutableArray。您可以只定义一个数组 var a = [],并使用 a.forEacha.pushObjecta.find 和所有其他函数。
    【解决方案2】:

    问题是我使用.push() 添加到App.Settings.filter.filter() 以从中删除。第一种方法不会创建新数组,后者会。这就是为什么从该数组中删除有效但添加无效的原因。

    我假设使用Ember.ArrayProxy.@each 的观察者会起作用。但那是我不知道的。不过,这个小问题只需创建一个新数组即可解决。

    filter = App.get('Settings.filter').slice(0);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多