Ember.js ComputedProperty没有';我不能得到更新

Ember.js ComputedProperty没有';我不能得到更新,ember.js,Ember.js,我有一个测试应用程序,它应该在每次单击应用程序视图时打印“过滤”和“更改”,因为调用了计算属性。但是,仅当使用空数组更新属性时才会触发属性绑定: window.App=Ember.Application.create({ 设置:Ember.Object.create({ 过滤器:[] }), ApplicationView:Ember.View.extend({ 单击:功能(事件){ filter=App.get('Settings.filter'); console.dir(过滤器); if(

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

window.App=Ember.Application.create({
设置:Ember.Object.create({
过滤器:[]
}),
ApplicationView:Ember.View.extend({
单击:功能(事件){
filter=App.get('Settings.filter');
console.dir(过滤器);
if(App.get('Room.filtered')){
过滤器=过滤器。过滤器(功能(项目){
返回项目!=App.get('Room.name');
});
}否则{
filter.push(App.get('Room.name'));
}
App.set('Settings.filter',filter);
}
})
});
房间=Ember.Object.extend({
名称:“测试”,
_过滤器:函数(){
console.dir(“已更改”);
}.观察(‘过滤’),
过滤:函数(){
console.dir(“过滤”);
filter=App.get('Settings.filter');
对于(变量i=0;i
以下是jsbin:

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

更新
这是一个正在工作的jsbin:

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

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

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

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

语法是:

function() {
}.property('App.settings.filter.@each')
它使用
setTimeout
的原因是您正在替换整个阵列,而不是其中的项目

我修复了你的jsbin:

我修复了一些次要的东西,比如
filter.push
现在是
filter.pushObject
(使用余烬)


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

从[]到可变数组的转换是否自动进行?如果没有您的小修改,
@each
的东西将无法工作(如果您从jsbin的第3版循环到第9版,您可以看到)。是的,Ember会自动将所有数组转换为
MutableArray
。您只需定义数组变量a=[],并使用
a.forEach
a.pushObject
a.find
和所有其他函数即可。