我想可以在一个 shellpage 中将许多角度模块附加到不同区域。但是 AngularJS 中的模块可以互相“交谈”吗?如果是,如何?
3 回答
模块可以通过多种方式交互或共享信息
一个模块可以注入另一个模块,在这种情况下,容器模块可以访问注入模块的所有元素。如果您查看Angular 种子项目,会为指令、控制器、过滤器等创建模块,类似这样
angular.module("myApp", ["myApp.filters", "myApp.services", "myApp.directives", "myApp.controllers"]) 这更像是一种重用机制而不是通信机制。
正如@Eduard 所解释的,第二个选项是使用服务。由于服务是单例的并且可以注入到任何控制器中,它们可以充当通信机制。
正如@Eduard 再次指出的那样,第三个选项是使用 $scope 对象来使用父控制器,因为它对所有子控制器都可用。
您还可以将 $rootScope 注入需要交互的控制器中,并使用 $broadcast 和 $on 方法来创建服务总线模式,其中控制器使用 pub\sub 机制进行交互。
我会倾向于第四个选项。也可以在此处查看更多详细信息AngularJS 中控制器之间通信的正确方法是什么?
使用服务机制在模块的控制器之间进行通信。
(function () {
'use strict';
//adding moduleB as dependency to moduleA
angular.module('Myapp.moduleA', ['Myapp.moduleB'])
.controller('FCtrl', FCtrl)
.service('sharedData', SharedData);
//adding the dependency shareData to FCtrl
FCtrl.$inject = ['sharedData'];
function FCtrl(sharedData) {
var vm = this;
vm.data = sharedData.data;
}
//shared data service
function SharedData() {
this.data = {
value: 'my shared data'
}
}
//second module
angular.module('Myapp.moduleB', [])
.controller('SCtrl', SCtrl);
SCtrl.$inject = ['sharedData'];
function SCtrl(sharedData) {
var vm = this;
vm.data = sharedData.data;
}
})();
HTML如下:
<html ng-app="firstModule">
<body>
<div ng-controller="FCtrl as xyz">
<input type=text ng-model="xyz.data.value" />
</div>
<div ng-controller="SCtrl as abc">
<input type=text ng-model="abc.data.value" />
</div>
</body>
</html>
您可以使用 服务和控制器继承(在此处解释http://docs.angularjs.org/guide/dev_guide.mvc.understanding_controller)
在任何情况下,您都应该考虑不要让您的控制器紧密耦合。