兄弟姐妹控制器可以在没有父级帮助的情况下相互通信 - AngularJS
Can Siblings Controllers communicate with each other without the help of the Parent - AngularJS
我正在开发一个AngularJS的小应用程序。我的项目包含一个 Body.html 文件,其中包含 3 个视图:侧菜单、标题和内容,每个视图都有自己的控制器和一个主控制器作为父控制器 - Body.html 的控制器。
标头的控制器可以更改侧菜单中的属性 - 侧菜单的打开/关闭状态。侧菜单控制器可以更改标题中的属性 - 标题的文本。
我可以使用主控制器,因为标头的控制器和侧菜单控制器都可以引用主控制器。但数据不会是一致的。从第一个控制器更新数据不会影响第二个控制器中的数据(不使用$watch)。
侧菜单的控制器和标头的控制器(同级控制器)可以相互通信吗?没有父母的帮助?
正文.html
<div>
<!-- Header placeholder -->
<div ui-view="header"></div>
<!-- SideMenu placeholder -->
<div ui-view="sideMenu"></div>
<!-- Content placeholder -->
<div ui-view></div>
</div>
标题.html
<div>
{{ headerCtrl.text }}
</div>
<div ng-click="headerCtrl.openSideMenu()">
--Open--
</div>
标头控制器.js
// sideMenuCtrl = ???
headerCtrl.text = "Title";
headerCtrl.openSideMenu = function()
{
sideMenuCtrl.isSideMenuOpen = true;
};
侧边菜单.html
<div ng-class={ 'side-menu-open': sideMenuCtrl.isSideMenuOpen }>
<div ng-repeat="menuItem in sideMenuCtrl.sideMenuItems"
ng-click="sideMenuCtrl.selectMenuItem(menuItem)">
{{ menuItem.text }}
</div>
</div>
侧边菜单控制器.js
// headerCtrl = ???
sideMenuCtrl.selectMenuItem = function(menuItem)
{
headerCtrl.text = menuItem.text;
}
正如我的评论中所述,您可以使用AngularJS服务在控制器之间共享一些数据。
app.service('AppContextService', function(){
this.context = {
isSideMenuOpen: false
};
});
app.controller('SideMenuCtrl', ['$scope', 'AppContextService', function($scope, AppContextService) {
// exposing the application context object to the controller.
$scope.appContext = AppContextService.context;
}]);
app.controller('HeaderCtrl', ['$scope', 'AppContextService', function($scope, AppContextService) {
$scope.appContext = AppContextService.context;
$scope.openSideMenu = function()
{
$scope.appContext.isSideMenuOpen = true;
};
}]);
然后调整 HTML 以使用共享appContext
对象。
<div ng-class={ 'side-menu-open': appContext.isSideMenuOpen }>
[...]
</div>
这是一个工作小提琴,说明了这个问题:小提琴
这个答案涵盖了使用service
来满足你的需求,但我确信还有其他(也许更好)的方法来解决这个问题,这可能涉及其他Angular
功能,甚至一些整体应用程序重构。
为了更深入地挖掘,这个SO主题可能是一个好的开始:服务,工厂和提供商之间的区别
相关文章:
- 如何在未直接触发的情况下停止事件
- 在不使用JQuery的情况下隐藏DOM中的选定元素
- 在不使用jquery的情况下查找页面中的所有锚点并附加函数
- 在不打开聊天屏幕的情况下制作Zopim-ding代理
- 在不阻止默认行为的情况下检测IE10中的缩放
- 如何在不传递此信息的情况下查找被调用的元素
- 如何在不刷新页面的情况下更新显示框
- 有没有一种方法可以在控制台关闭的情况下让console.log()在IE中记录消息
- JavaScript-在手机上不工作的情况下,在外部单击时隐藏元素
- 在我的情况下,如何进行http请求
- 在不知道深度或父属性的情况下从对象中删除属性
- 在不破坏未定义函数的情况下,对多个视图使用单个js文件
- ROR:如何在不重新加载浏览器的情况下从控制器获取参数
- 如何在不影响其他元素的情况下扩展DIV
- 如何在内联依赖项并将图像转换为dataURI的情况下完全提取网页
- 在不移动内部文本的情况下缩放元素的效果
- 在不设置协议的情况下,使用javascript/jquery更改iframe-src
- 默认情况下折叠和展开嵌套列表
- 如何在不单击javascript中的按钮的情况下触发事件
- 我们如何在不更改url的情况下使用锚点点击从一个页面重定向到另一个页面