在视图中订阅模型事件的正确方法是什么?

时间:2013-02-14 18:23:48

标签: ember.js

我想在我的视图中订阅模型的becomeInvalid和BecomeError事件,这样我就可以设置一些错误状态。我可以想到两种方法,都有它们的缺点。

我能想到的第一种方法是使用观察者在视图上创建我自己的becomeInvalid和becomeError钩子:

becameInvalid: function() {
  var isValid = this.get('controller.model.isValid');
  if (Ember.isNone(isValid) || isValid) {
    return;
  }
  console.log('becameInvalid');
}.observes('controller.model.isValid')

becameError: function() {
  var isError = this.get('controller.model.isError');
  if (Ember.isNone(isError) || !isError) {
    return;
  }
  console.log('becameError');
}.observes('controller.model.isError')

这可行,但使用了很多样板代码。我能想到的第二种方法是在加载模型后为事件添加处理程序:

didLoad: function() {
  var isLoaded = this.get('controller.model.isLoaded');
  if (Ember.isNone(isLoaded) || !isLoaded) {
    return;
  }
  var model = this.get('controller.model');
  model.on('becameInvalid', function() {
    console.log('becameInvalid');
  });
  model.on('becameError', function() {
    console.log('becameError');
  });
}.observes('controller.model.isLoaded')

这种方法的问题在于它仍然需要一些样板代码并且(如果我错了,请纠正我)在删除视图时不会自动清除事件处理程序。

我想做的是与框架自动清理的事件的观察者协议类似的东西。 E.g:

becameInvalid: function() {
  console.log('becameInvalid');
}.eventHandler('controller.model.becameInvalid')

becameError: function() {
  console.log('becameError');
}.eventHandler('controller.model.becameError')

这样的事情是否存在?

1 个答案:

答案 0 :(得分:0)

我认为您的第一个提案是可行的解决方案。这是它的一个版本,有点简洁:

isValid : Ember.Computed.alias("controller.model.isValid"),
becameInvalid: function() {
  if(this.get("isValid"){
     return;
  }
  console.log('becameInvalid');
}.observes('isValid')

有关Ember.computed.alias的一些详细信息,请参阅此question。 除此之外,我发现没有可能在某些情况下触发观察者(=当isValid变为假时)与开箱即用的功能Ember。你必须自己实现这样一个观察者。