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')
這樣的事情是否存在?