Emberjs - 临时禁用属性更改通知

时间:2012-05-03 16:23:37

标签: binding ember.js observable

是否有任何简单的方法可以暂时禁用对象属性或属性的通知?

我知道您可以使用beginPropertyChanges()endPropertyChanges()推迟发送,但我不希望在明确启用这些更改之前通知这些更改。

提前谢谢。

使用案例 我必须使用另一个对象(A)设置对象(B)的属性。其他对象的几种方法正在观察B的属性。在某个时候,B对象的数据被清除并且观察者得到通知,稍后HTTP响应会为它们设置一些有用的东西。我不希望在清除对象时通知观察者因为属性值在那时无效。

2 个答案:

答案 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的值。我不建议在观察者中重置限制器变量,因为如果将属性设置为已有的属性,它将不会运行。