由於您的問題主要涉及在任何給定點顯示的信息而不是業務邏輯,我的解決方案是將頂部面板和側欄視圖的可見性綁定到應用程序控制器中的屬性。如果你要使用一個mixin,我會使用一個爲應用程序路由中的屬性加上別名,並且可能會給你一些顯示,隱藏或切換狀態的操作。例如:
//application controller
export default Ember.Controller.extend({
isTopPanelVisible: false,
isSideBarVisible: false
});
//panel visibility mixin
export default Ember.Mixin.create({
needs: ["application"],
isTopPanelVisible: Ember.computed.alias("controllers.application.isTopPanelVisible"),
isSideBarVisible: Ember.computed.alias("controllers.application.isSideBarVisible"),
actions: {
showTopPanel: function(){
this.set("isTopPanelVisible", true);
},
showSideBar: function(){
this.set("isSideBarVisible", true);
}
}
});
//controller for some route
export default Ember.ObjectController.extend(panelVisibility, {
initializeRoutesVisibility: function(){
this.set("isTopPanelVisible", true);
this.set("isSideBarVisible", false);
}.on("init")
});
//sidebar view
export default Ember.View.extend({
classNameBindings: ["hidden"],
hidden: true,
setVisibility: function(){
if (this.get("controller.isSideBarVisible"){
this.set("hidden", false);
} else {
this.set("hidden", true);
}
}.observes("controller.isSideBarVisible").on("didInsertElement")
});
//top panel view
export default Ember.View.extend({
classNameBindings: ["hidden"],
hidden: true,
setVisibility: function(){
if (this.get("controller.isTopPanelVisible"){
this.set("hidden", false);
} else {
this.set("hidden", true);
}
}.observes("controller.isTopPanelVisible").on("didInsertElement")
});
//some css file
.hidden {
display: none;
}
我認爲這個解決方案更「Ember」,給你更多的靈活性。狀態被存儲在一個其他地方所觀察到的地方,業務邏輯進入控制器,顯示邏輯進入視圖。