我正在使用AngularJS中的一个小应用程序。我的项目包含一个Body.html文件,其中包含3个视图: SideMenu ,标题和内容,每个视图都有自己的Controller和MainController parent - Body.html的控制器。
标题控制器是否可以更改侧边菜单中的属性 - 侧边菜单的打开/关闭状态。
并且侧面菜单控制器可以更改标题中的属性 - 标题文本。
我可以使用主控制器,因为标题控制器和侧菜单控制器都可以引用主控制器。但数据不会成为现实。从第一个控制器更新数据不会影响第二个控制器中的数据(不使用$ watch)。
侧菜单控制器和标题控制器(兄弟控制器)可以相互通信吗?没有父母的帮助?
的 Body.html
Element
header.html中
<div>
<!-- Header placeholder -->
<div ui-view="header"></div>
<!-- SideMenu placeholder -->
<div ui-view="sideMenu"></div>
<!-- Content placeholder -->
<div ui-view></div>
</div>
HeaderController.js
<div>
{{ headerCtrl.text }}
</div>
<div ng-click="headerCtrl.openSideMenu()">
--Open--
</div>
SideMenu.html
// sideMenuCtrl = ???
headerCtrl.text = "Title";
headerCtrl.openSideMenu = function()
{
sideMenuCtrl.isSideMenuOpen = true;
};
SideMenuController.js
<div ng-class={ 'side-menu-open': sideMenuCtrl.isSideMenuOpen }>
<div ng-repeat="menuItem in sideMenuCtrl.sideMenuItems"
ng-click="sideMenuCtrl.selectMenuItem(menuItem)">
{{ menuItem.text }}
</div>
</div>
答案 0 :(得分:4)
如我的评论中所述,您可以使用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>
这是一个解释问题的工作小提琴:fiddle
这个答案涵盖了使用service
来满足您的需求,但我确信还有其他(也许是更好的)方法可以解决可能涉及其他Angular
功能的问题,甚至一些整体应用程序重构。
为了深入挖掘,这个SO主题可能是一个好的开始:difference between service, factory and providers