Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 兄弟控制器是否可以在没有父-AngularJS帮助的情况下相互通信_Javascript_Angularjs_Siblings - Fatal编程技术网

Javascript 兄弟控制器是否可以在没有父-AngularJS帮助的情况下相互通信

Javascript 兄弟控制器是否可以在没有父-AngularJS帮助的情况下相互通信,javascript,angularjs,siblings,Javascript,Angularjs,Siblings,我正在AngularJS中开发一个小应用程序。我的项目包含一个Body.html文件,其中包含3个视图:侧菜单、标题和内容,每个视图都有自己的控制器和一个主控制器作为Body.html的父级控制器。 标题控制器是否可以更改侧菜单中的属性-侧菜单的打开/关闭状态。 侧菜单控制器是否可以更改标题中的属性-标题的文本。 我可以使用主控制器,因为标题的控制器和侧菜单控制器都可以引用主控制器。但这些数据并不真实。更新第一控制器wan中的数据不会影响第二控制器中的数据(不使用$watch)。 侧菜单的

我正在AngularJS中开发一个小应用程序。我的项目包含一个Body.html文件,其中包含3个视图:侧菜单标题内容,每个视图都有自己的控制器和一个主控制器作为Body.html的父级控制器。
标题控制器是否可以更改侧菜单中的属性-侧菜单的打开/关闭状态。 侧菜单控制器是否可以更改标题中的属性-标题的文本。
我可以使用主控制器,因为标题的控制器和侧菜单控制器都可以引用主控制器。但这些数据并不真实。更新第一控制器wan中的数据不会影响第二控制器中的数据(不使用$watch)。

侧菜单的控制器和标题的控制器(同级控制器)能否相互通信?没有父母的帮助


Body.html

 <div>
     <!-- Header placeholder -->
     <div ui-view="header"></div>

     <!-- SideMenu placeholder -->
     <div ui-view="sideMenu"></div>

     <!-- Content placeholder -->
     <div ui-view></div>
 </div>
 <div>
    {{ headerCtrl.text }}
 </div>
 <div ng-click="headerCtrl.openSideMenu()">
    --Open--
 </div>
 <div ng-class={ 'side-menu-open': sideMenuCtrl.isSideMenuOpen }>

     <div ng-repeat="menuItem in sideMenuCtrl.sideMenuItems"
          ng-click="sideMenuCtrl.selectMenuItem(menuItem)">
          {{ menuItem.text }}
     </div>
 </div>
SideMenu.html

 <div>
     <!-- Header placeholder -->
     <div ui-view="header"></div>

     <!-- SideMenu placeholder -->
     <div ui-view="sideMenu"></div>

     <!-- Content placeholder -->
     <div ui-view></div>
 </div>
 <div>
    {{ headerCtrl.text }}
 </div>
 <div ng-click="headerCtrl.openSideMenu()">
    --Open--
 </div>
 <div ng-class={ 'side-menu-open': sideMenuCtrl.isSideMenuOpen }>

     <div ng-repeat="menuItem in sideMenuCtrl.sideMenuItems"
          ng-click="sideMenuCtrl.selectMenuItem(menuItem)">
          {{ menuItem.text }}
     </div>
 </div>

如我在评论中所述,您可以使用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>

[...]
下面是一把小提琴,它说明了这个问题:

这个答案涵盖了如何使用
服务来满足您的需求,但我确信还有其他(也许更好)方法来解决这个问题,可能涉及其他
角度
功能,甚至一些整体应用程序重构


要深入挖掘,本SO主题可能是一个良好的开端:

您可能希望使用服务或工厂在控制器之间共享数据和逻辑。请参阅angular documentation and guide about,redux/flux是一种很好的模式,适用于所有同级和子级的自顶向下数据流。或者,更一般地说,是EventEmitter,或者现有父级上的DOM事件(事件冒泡)。一个全局变量(恐怖)可以在小型应用程序中发挥极其简单的作用。一个全局变量可以使用服务/工厂在控制器之间共享数据。但我会遇到与使用父作用域相同的问题—数据不包含。我需要使用$watch并监听每个控制器中的数据更改。如果没有$watch,我可以这样做吗?请参阅我的答案,其中不使用$watch。