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