有没有简单的方法来达到目的或多种性质的通知,暂时禁止?
我知道你可以推迟他们beginPropertyChanges()
和endPropertyChanges()
但我不希望在所有通知这些变化,直到我明确启用它们。
先感谢您。
使用案例:我必须设置一个对象(的性质A
)与另一对象( B
)。 的性质B
正在被其他对象的几种方法观察到的。 在一段时间的B
对象的数据将被清除和观察员得到通知,后来的HTTP响应集他们一些有用的东西。 我不希望清除对象当观察者得到通知,因为属性值不是在那一刻有效。
这是一个老问题,但它出现暂停观察员谷歌搜索高,所以我会发表评论。
有明显的用例这样的功能,例如,一个对象的属性的枚举由列表框表示,并且该对象可以改变。 如果列表框是用来从服务器请求属性更改和设置上成功的新的价值,自然的方式来做事是使用控制器属性与列表框,该属性设置为对象属性的对象发生变化时,并观察它发出请求到服务器。 在这种情况下,每当对象改变观察者将收到不想要的通知。
不过,我同意这些使用情况的不同作用,有没有办法可以烬支持他们。
因此,可能的解决办法是在控制器中声明一个变量,只要你更改属性,这样你才反应过来由用户所做的更改使用它:
doNotReact: false,
updateManually: function() {
this.doNotReact = true;
Ember.run.scheduleOnce('actions', this, function() {
this.doNotReact = false;
});
............
this.set('something', somevalue);
............
},
onChange: function() {
if (this.doNotReact) return;
...............
}.observes('something')
观察者得到机会运行后doNotReact的价值将被重置。 我不建议塞变量重新观察者,因为如果你的属性设置为它已经具有相同的价值也将无法运行。
恩贝尔不支持暂停的通知。 我强烈建议对在上述评论中提到的私有API的玩弄。
我不知道为什么你懒得之前的HTTP请求清除对象的数据? 似乎很奇怪。
使用标志将导致计算仍然触发。
我拿出最好的是重写计算与最后一个已知值。 稍后,您可以通过重新设置计算的属性定义启用它。
let _myComputedProperty = Ember.computed('foobar', function() {
let foobar = this.get('foobar');
console.log('myComputedProperty triggered >', foobar);
return '_' + foobar + '_';
});
Controller.extend({
turnOffComputed: function() {
let myComputedProperty = this.get('myComputedProperty');
this.set('myComputedProperty', myComputedProperty);
},
turnOnComputed: function() {
this.set('myComputedProperty', _myComputedProperty);
}
})
完整的示例: 有条件的计算性能的结合