兄弟控制器可以在没有 Parent - AngularJS 帮助的情况下相互通信吗?
Can Siblings Controllers communicate with each other without the help of the Parent - AngularJS
我正在 AngularJS 开发一个小应用程序。我的项目包含一个包含 3 个视图的 Body.html 文件:SideMenu、Header 和 Content,每个都有自己的 Controller 和 MainController,因为 parent - Body.html 的控制器。
header 的控制器能否更改 side-menu 中的 属性 - side-menu 的 open/close 状态。
side-menu 控制器能否更改 header 中的 属性 - header 的文本。
我可以使用主控制器,因为 header 的控制器和 side-menu 控制器都可以引用主控制器。但数据不会一致。更新来自第一个控制器的数据不会影响第二个控制器中的数据(不使用 $watch)。
side-menu的控制器和header的控制器(兄弟控制器)是否可以相互通信?没有 parent?
的帮助
Body.html
<div>
<!-- Header placeholder -->
<div ui-view="header"></div>
<!-- SideMenu placeholder -->
<div ui-view="sideMenu"></div>
<!-- Content placeholder -->
<div ui-view></div>
</div>
Header.html
<div>
{{ headerCtrl.text }}
</div>
<div ng-click="headerCtrl.openSideMenu()">
--Open--
</div>
HeaderController.js
// sideMenuCtrl = ???
headerCtrl.text = "Title";
headerCtrl.openSideMenu = function()
{
sideMenuCtrl.isSideMenuOpen = true;
};
SideMenu.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>
SideMenuController.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>
这是一个可以说明问题的有效 fiddle:fiddle
这个答案涵盖了 service
的使用以满足您的需求,但我相信还有其他(也许更好)的方法可以解决可能涉及其他 Angular
功能的问题,甚至一些整体应用程序重构。
为了更深入地挖掘,这个 SO 主题可能是一个好的开始:difference between service, factory and providers
我正在 AngularJS 开发一个小应用程序。我的项目包含一个包含 3 个视图的 Body.html 文件:SideMenu、Header 和 Content,每个都有自己的 Controller 和 MainController,因为 parent - Body.html 的控制器。
header 的控制器能否更改 side-menu 中的 属性 - side-menu 的 open/close 状态。
side-menu 控制器能否更改 header 中的 属性 - header 的文本。
我可以使用主控制器,因为 header 的控制器和 side-menu 控制器都可以引用主控制器。但数据不会一致。更新来自第一个控制器的数据不会影响第二个控制器中的数据(不使用 $watch)。
side-menu的控制器和header的控制器(兄弟控制器)是否可以相互通信?没有 parent?
Body.html
<div>
<!-- Header placeholder -->
<div ui-view="header"></div>
<!-- SideMenu placeholder -->
<div ui-view="sideMenu"></div>
<!-- Content placeholder -->
<div ui-view></div>
</div>
Header.html
<div>
{{ headerCtrl.text }}
</div>
<div ng-click="headerCtrl.openSideMenu()">
--Open--
</div>
HeaderController.js
// sideMenuCtrl = ???
headerCtrl.text = "Title";
headerCtrl.openSideMenu = function()
{
sideMenuCtrl.isSideMenuOpen = true;
};
SideMenu.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>
SideMenuController.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>
这是一个可以说明问题的有效 fiddle:fiddle
这个答案涵盖了 service
的使用以满足您的需求,但我相信还有其他(也许更好)的方法可以解决可能涉及其他 Angular
功能的问题,甚至一些整体应用程序重构。
为了更深入地挖掘,这个 SO 主题可能是一个好的开始:difference between service, factory and providers