这是一个古老的问题,但在谷歌搜索暂停观察者时似乎很高,所以我会发表评论。
这种特性有明显的用例,例如,对象的枚举属性由列表框表示,并且对象可能会更改。如果列表框用于向服务器请求属性更改并在成功时设置新值,那么自然的做法是使用列表框的控制器属性,当对象更改时将该属性设置为对象属性,并观察它向服务器发出请求。在这种情况下,只要对象发生变化,观察者就会收到不需要的通知。
但是,我同意这些用例是如此多样化,以至于 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 的值将在观察者有机会运行后重置。我不建议在观察者中重置 stopper 变量,因为如果您将属性设置为它已有的相同值,它将不会运行。