2013-02-14 87 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。你將不得不自己實現這樣一個觀察者。

相關問題