如何在Ember.Object中观察Array字段?

时间:2012-05-15 14:29:54

标签: ember.js

我有这段代码(http://jsfiddle.net/stephane_klein/gyHmS/2/):

App = Ember.Application.create({});

App.Item = Ember.Object.extend({
    title: null,
    parent: null
});

App.MyList = Ember.Object.extend({
    title: null,
    content: [],
    changed: function() {
        console.log('here');
    }.observes('content')
});

App.list = App.MyList.create({
    title: "foobar",
    content: [
        App.Item.create({
            item: "item1"
        }),
        App.Item.create({
            item: "item2"
        })
    ]
});
console.log(App.list.content);

App.list.content.pushObject(
    App.Item.create({
        item: "item3"
    })
);
console.log(App.list.content);

为什么“console.log('here')”从未被调用过?

我想在App.Iy中插入App.Item时设置App.Item.parent。我不知道如何观察App.MyList.content字段。

感谢您的帮助。

祝你好运, 斯蒂芬

1 个答案:

答案 0 :(得分:5)

你没有改变内容属性,你只是在那里推送一个对象。 你有两个解决方案:

  • 您可以观察内容的每个项目(使用.observes('content.@each')),但请注意,该方法可以多次调用
  • 或手动通知此属性已更改(使用this.notifyPropertyChange('content')

这是第一个解决方案:jsfiddle using @each

这是第二个解决方案:jsfiddle using notifyPropertyChange

您还必须注意,您不应直接使用App.list.content,而应使用App.list.get('content')。如果您想了解更多信息,请查看this article written by Roy Daniels

修改

请注意@each的使用略有变化。 Ember.Array#@each documentation说:

  

返回一个可用于观察个体的特殊对象   数组上的属性。只需获得相应的财产   对象,它将返回一个自动映射到的枚举   成员对象上的命名键。

     

如果您只想查看要添加或删除的任何项目   数组,使用[]属性而不是@each。

让我们看一下例子:

App.Post = Ember.Object.extend({
  createdAt: null
});

App.Blog = Ember.Object.extend({
  posts: null,

  init: function() {
    this._super();
    this.set 'posts', [];
  },

  newerPost: function() {
    return this.get('posts').sortBy('createdAt').get('firstObject');
  }.property('posts.@each.createdAt'),

  postsCount: function() {
    return this.get('posts.length');
  }.property('posts.[]')
});

newerPost需要观察每个posts的特定属性,而postsCount只需知道posts数组何时更改。