2

有没有什么简单的方法可以暂时禁用一个或多个对象属性的通知?

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

先感谢您。

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

4

3 回答 3

2

Ember 不支持暂停通知。我强烈建议不要玩弄上述评论中提到的私有 API。

我想知道您为什么要在 HTTP 请求之前清除对象的数据?似乎很奇怪。

于 2012-06-03T08:29:13.353 回答
1

使用标志将导致计算仍然触发。

我想出的最好的方法是用最后一个已知值覆盖计算。稍后您可以通过再次设置计算属性定义来启用它。

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);
  }
})

完整示例:计算属性的条件绑定

于 2016-08-16T05:46:53.437 回答
0

这是一个古老的问题,但在谷歌搜索暂停观察者时似乎很高,所以我会发表评论。

这种特性有明显的用例,例如,对象的枚举属性由列表框表示,并且对象可能会更改。如果列表框用于向服务器请求属性更改并在成功时设置新值,那么自然的做法是使用列表框的控制器属性,当对象更改时将该属性设置为对象属性,并观察它向服务器发出请求。在这种情况下,只要对象发生变化,观察者就会收到不需要的通知。

但是,我同意这些用例是如此多样化,以至于 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 变量,因为如果您将属性设置为它已有的相同值,它将不会运行。

于 2015-03-11T11:51:20.307 回答