有没有什么简单的方法可以暂时禁用一个或多个对象属性的通知?
我知道您可以推迟它们,beginPropertyChanges()但endPropertyChanges()我不希望在我明确启用它们之前通知这些更改。
先感谢您。
用例:A我必须用另一个对象 ( )
设置一个对象 ( ) 的属性B。的属性B正在通过其他对象的几种方法进行观察。有时B对象的数据会被清除并通知观察者,稍后 HTTP 响应会为他们设置一些有用的东西。我不希望在清除对象时通知观察者,因为此时属性值无效。
有没有什么简单的方法可以暂时禁用一个或多个对象属性的通知?
我知道您可以推迟它们,beginPropertyChanges()但endPropertyChanges()我不希望在我明确启用它们之前通知这些更改。
先感谢您。
用例:A我必须用另一个对象 ( )
设置一个对象 ( ) 的属性B。的属性B正在通过其他对象的几种方法进行观察。有时B对象的数据会被清除并通知观察者,稍后 HTTP 响应会为他们设置一些有用的东西。我不希望在清除对象时通知观察者,因为此时属性值无效。
Ember 不支持暂停通知。我强烈建议不要玩弄上述评论中提到的私有 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);
}
})
完整示例:计算属性的条件绑定
这是一个古老的问题,但在谷歌搜索暂停观察者时似乎很高,所以我会发表评论。
这种特性有明显的用例,例如,对象的枚举属性由列表框表示,并且对象可能会更改。如果列表框用于向服务器请求属性更改并在成功时设置新值,那么自然的做法是使用列表框的控制器属性,当对象更改时将该属性设置为对象属性,并观察它向服务器发出请求。在这种情况下,只要对象发生变化,观察者就会收到不需要的通知。
但是,我同意这些用例是如此多样化,以至于 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 变量,因为如果您将属性设置为它已有的相同值,它将不会运行。