2013-02-14 28 views
3

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

我能想到的第一个方法是使用观察员在视图中创建我自己的becameInvalid和becameError挂钩:

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') 

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

我想要做的是类似观察者协议的事件,这些事件将被框架自动清理。例如:

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

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

这样的事情是否存在?

回答

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变成false时)才会触发观察者,并具有开箱即用的功能Ember。你将不得不自己实现这样一个观察者。

相关问题