由于您的问题主要涉及在任何给定点显示的信息而不是业务逻辑,我的解决方案是将顶部面板和侧栏视图的可见性绑定到应用程序控制器中的属性。如果你要使用一个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”,给你更多的灵活性。状态被存储在一个其他地方所观察到的地方,业务逻辑进入控制器,显示逻辑进入视图。