是否有任何简单的方法可以暂时禁用对象属性或属性的通知?
我知道您可以使用beginPropertyChanges()
和endPropertyChanges()
推迟发送,但我不希望在明确启用这些更改之前通知这些更改。
提前谢谢。
使用案例
我必须使用另一个对象(A
)设置对象(B
)的属性。其他对象的几种方法正在观察B
的属性。在某个时候,B
对象的数据被清除并且观察者得到通知,稍后HTTP响应会为它们设置一些有用的东西。我不希望在清除对象时通知观察者因为属性值在那时无效。
答案 0 :(得分:2)
Ember不支持暂停通知。我强烈建议不要使用上述评论中提到的私有API。
我想知道你为什么要在HTTP请求之前清除对象的数据呢?看起来很奇怪。
答案 1 :(得分:-1)
这是一个老问题,但谷歌搜索暂停观察员似乎很高,所以我会发表评论。
此类功能有明显的用例,例如,对象的枚举属性由列表框表示,对象可能会更改。如果列表框用于从服务器请求属性更改并将新值设置为成功,则自然的方法是使用带有列表框的控制器属性,当对象更改时将该属性设置为对象属性,并观察它向服务器发出请求。在这种情况下,只要对象发生变化,观察者就会收到不需要的通知。
但是,我同意这些用例非常多样化,以至于Ember无法支持它们。
因此,可能的解决方法是在控制器中声明一个变量,并在每次更改属性时使用它,以便您只对用户所做的更改做出反应:
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的值。我不建议在观察者中重置限制器变量,因为如果将属性设置为已有的属性,它将不会运行。