2

我有这个代码(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.Item 插入 App.MyList 时,我想设置 App.Item.parent。我不知道如何观察 App.MyList.content 字段。

谢谢你的帮助。

最好的问候,斯蒂芬

4

1 回答 1

5

您没有更改 content 属性,您只是将一个对象推入其中。你有两个解决方案:

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

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

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

您还必须注意您不应该直接使用,App.list.content而是应该使用App.list.get('content')。如果您想了解更多信息,请查看Roy Daniels 撰写的这篇文章。

编辑

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

返回一个特殊对象,可用于观察数组上的各个属性。只需获取此对象的等效属性,它将返回一个自动映射到成员对象上的命名键的可枚举。

如果您只想查看添加或删除到数组中的任何项目,请使用 [] 属性而不是 @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需要观察 each 的特定属性posts,而postsCount只需要知道posts数组何时更改。

于 2012-05-15T14:47:54.860 回答