由于您的问题主要涉及在任何给定点显示哪些信息而不是业务逻辑,因此我的解决方案是将顶部面板和侧边栏视图的可见性绑定到应用程序控制器中的属性。如果您要使用 mixin,我会使用一个为应用程序路由中的属性设置别名的 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”,并为您提供了更多的灵活性。状态存储在一个其他所有东西都可以观察到的地方,业务逻辑在控制器中,显示逻辑在视图中。