Binding Emberjs-临时禁用属性更改通知
有没有简单的方法可以临时禁用对象属性的通知 我知道您可以使用Binding Emberjs-临时禁用属性更改通知,binding,ember.js,observable,Binding,Ember.js,Observable,有没有简单的方法可以临时禁用对象属性的通知 我知道您可以使用beginPropertyChanges()和endPropertyChanges()延迟这些更改,但我不希望在明确启用这些更改之前通知这些更改 先谢谢你 用例: 我必须用另一个对象(B)设置对象(a)的属性。B的特性正被其他对象的几种方法所观察。在某个时候,B对象的数据被清除,观察者得到通知,然后HTTP响应为他们设置有用的内容。我不希望在清除对象时通知观察者,因为此时属性值无效。Ember不支持挂起通知。我强烈建议不要玩弄上述评论中
beginPropertyChanges()
和endPropertyChanges()
延迟这些更改,但我不希望在明确启用这些更改之前通知这些更改
先谢谢你
用例:
我必须用另一个对象(
B
)设置对象(a
)的属性。B
的特性正被其他对象的几种方法所观察。在某个时候,B
对象的数据被清除,观察者得到通知,然后HTTP响应为他们设置有用的内容。我不希望在清除对象时通知观察者,因为此时属性值无效。Ember不支持挂起通知。我强烈建议不要玩弄上述评论中提到的私有API
我想知道你为什么要在HTTP请求之前清除对象的数据?这似乎很奇怪。这是一个老问题,但它在谷歌搜索暂停观察员时显得很高,所以我要发表评论 此类功能有明显的用例,例如,对象的枚举属性由列表框表示,并且对象可能会更改。如果列表框用于从服务器请求属性更改,并在成功时设置新值,那么自然的做法是在列表框中使用控制器属性,在对象更改时将该属性设置为object属性,并观察该属性以向服务器发出请求。在这种情况下,只要对象发生变化,观察者就会收到不需要的通知 然而,我同意这些用例是如此多样化,以至于余烬无法支持它们 因此,一种可能的解决方法是在控制器中声明一个变量,并在更改属性时使用它,以便仅对用户所做的更改作出反应:
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的值将重置。我不建议在observer中重置stopper变量,因为如果将属性设置为它已经具有的相同值,它将不会运行。使用标志将导致computed仍然触发 我想到的最好办法是用最后一个已知的值覆盖计算出的值。稍后,可以通过再次设置计算特性定义来启用它
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.\u suspendObserver
和Ember.\u suspendListener
,甚至可能Ember.removeObserver
。