我有这段代码(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字段。
感谢您的帮助。
祝你好运, 斯蒂芬
答案 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
数组何时更改。