2012-03-20 46 views
2

我有一個列出相冊的應用程序。當同時點擊AlbumViewApp.overlay(也是一個視圖)時,會顯示相冊。Ember的可靠觀點

App.overlay = Ember.View.create({...})(與燈箱一樣疊加)。

和:

App.AlbumView = Ember.View.extend({ 
    // close the selected album view by closing the overlay 
    close: function() { 
    App.overlay.close(); 
    } 
}); 

而這裏的問題:我希望能夠通過點擊疊加關閉這些兩種觀點,但我想覆蓋到保持的AlbumView獨立,讓我可以在其他地方使用覆蓋(即不要在兩者之間引入耦合)。我該怎麼做?

這是我目前的執行情況,緊耦合的,我真的不喜歡:

App.overlay = Ember.View.create({ 
    // handle clicking anywhere on the overlay 
    click: function() { 
    this.close(); 
    }, 

    // close the overlay (setting selectedAlbum's controller content to null hides the AlbumView) 
    close: function() { 
    App.selectedAlbumController.set('content', null); // this should not be here 
    this.remove(); 
    } 
}); 

回答

0

約在一個混合的提取方法close什麼?

App.AlbumClosing = Ember.Mixin.create({ 
    close: function() { 
     App.selectedAlbumController.set('content', null); 
     this.remove(); 
    } 
}); 

var overlay = Ember.View.create(App.AlbumClosing, { 
    click: function() { 
     this.close(); 
    } 
}); 
+0

這並不能解決任何問題。它只隱藏了原始問題(耦合)。想象一下,我會有10個不同的「selectedSomething」控制器。然後我需要在這個方法中放置10個不同的行,比如'set('content',null)'。絕對不是要走的路。 – 2012-03-20 13:59:15

1

我纔剛剛學習燼,所以藉此與一粒鹽...

你可以一個「可見的」屬性添加到覆蓋,然後從其他AlbumView觀察它。像這樣:

var overlay = Ember.View.create({ 
    visible: true, 
    click: function() { 
    this.close(); 
    }, 
    close: function() { 
    this.set('visible', false); 
    this.remove(); 
    } 
}); 

App.AlbumView = Ember.View.extend({ 
    overlayClosed: function() { 
    App.selectedAlbumController.set('content', null); 
    this.remove(); 
    }.observes('overlay.visible') 
}); 
+0

我已經修改了一些原始問題,並回答了所有問題。你的原始答案足以讓我走了:) – 2012-03-21 13:11:34