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

2019-09-17 00:33发布

有没有简单的方法来达到目的或多种性质的通知,暂时禁止?

我知道你可以推迟他们beginPropertyChanges()endPropertyChanges()但我不希望在所有通知这些变化,直到我明确启用它们。

先感谢您。

使用案例:我必须设置一个对象(的性质A )与另一对象( B )。 的性质B正在被其他对象的几种方法观察到的。 在一段时间的B对象的数据将被清除和观察员得到通知,后来的HTTP响应集他们一些有用的东西。 我不希望清除对象当观察者得到通知,因为属性值不是在那一刻有效。

Answer 1:

这是一个老问题,但它出现暂停观察员谷歌搜索高,所以我会发表评论。

有明显的用例这样的功能,例如,一个对象的属性的枚举由列表框表示,并且该对象可以改变。 如果列表框是用来从服务器请求属性更改和设置上成功的新的价值,自然的方式来做事是使用控制器属性与列表框,该属性设置为对象属性的对象发生变化时,并观察它发出请求到服务器。 在这种情况下,每当对象改变观察者将收到不想要的通知。

不过,我同意这些使用情况的不同作用,有没有办法可以烬支持他们。

因此,可能的解决办法是在控制器中声明一个变量,只要你更改属性,这样你才反应过来由用户所做的更改使用它:

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的价值将被重置。 我不建议塞变量重新观察者,因为如果你的属性设置为它已经具有相同的价值也将无法运行。



Answer 2:

恩贝尔不支持暂停的通知。 我强烈建议对在上述评论中提到的私有API的玩弄。

我不知道为什么你懒得之前的HTTP请求清除对象的数据? 似乎很奇怪。



Answer 3:

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

我拿出最好的是重写计算与最后一个已知值。 稍后,您可以通过重新设置计算的属性定义启用它。

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

完整的示例: 有条件的计算性能的结合



文章来源: Emberjs - Temporary disable property changes notification