请参阅this plunker code(通知console.log消息)以了解我想说/要求的内容。
我定义了3个模块,即myApp
,myApp.view1
,myApp.view2
。只有myApp
模块在另一个模块上声明了依赖关系。
myApp模块
angular.module('myApp', ['ngRoute','myApp.view1','myApp.view2'])
.config(['$routeProvider', function($routeProvider) {
$routeProvider.otherwise({redirectTo: '/view1'});
}])
.value('author', 'Suman Barick')
myApp.view1模块
angular.module('myApp.view1', ['ngRoute'])
.config(['$routeProvider', function($routeProvider) {
$routeProvider.when('/view1', {
template: 'Welcome to view ONE',
controller: 'View1Ctrl'
});
}])
.controller('View1Ctrl', ['author', function(author) {
console.log('*******************************************');
console.log('I am on view1 module');
console.log('Printing author value from myApp module ' + author);
console.log('*******************************************');
}])
.value('view1_var', 'Hi, I am defined as value in myApp.view1 module')
.service('serviceV1', function(){
this.getData = function(){return 'abcdef';}
console.log('This is a service from myApp.view1 module');
})
myApp.view2模块
angular.module('myApp.view2', ['ngRoute'])
.config(['$routeProvider', function($routeProvider) {
$routeProvider.when('/view2', {
template: 'Welcome to view TWO',
controller: 'View2Ctrl'
});
}])
.controller('View2Ctrl', ['view1_var','serviceV1', function(view1_var, serviceV1) {
console.log('*******************************************');
console.log('Look I am accessing view1_var and serviceV1 of view1 module... from view2 module');
console.log(view1_var);
console.log(serviceV1.getData());
console.log('*******************************************');
}]);
我的疑问/问题:
为什么" myApp.view1"模块访问"作者"在" myApp"上定义的值模块。 "对myApp"依赖于" myApp.view1",但反之亦然。
更有趣的是," myApp.view1"和" myApp.view2"是2个完全独立的模块。然后怎么来" myApp.view2"从" myApp.view1"访问view1_var
和serviceV1
甚至没有声明对它的任何依赖?
这是预期的设计/行为吗?那么我可以在一个模块中定义的其他内容是什么,但在任何其他模块中使用它而不管它们之间的依赖性如何?
有人可以解释一下吗?
答案 0 :(得分:2)
经过一番研究后,感谢@dewd指出我接受this question的答案,我来到后面的结论,
所以,这里有我的定理 [见下图说明]
如果
- 存在n个模块命名A1,A2,A3,...,An,A1取决于A2,A2取决于A3等......
- 另外,m模块命名为B1,B2,B3,.... Bm,B1取决于B2,B2取决于B3等......
- 还存在一个顶级(est)级依赖模块,比如'AB',它依赖于模块'A1'和'B1'
- 然后,模块'An'将能够访问任何 模块'Bm'上声明的服务
醇>
插图图片
实验和证明
请参阅此plunkr了解演示。
这里我已经宣布了7个模块,
现在,
b3service
模块B3
AB
模块
b3service
访问A3
(请参阅控制台消息) 但是,A3
和B3
没有直接关联或依赖关系。
这是我的 HTML
<body id="body" ng-app="AB">
<h1>Hello Plunker!</h1>
<script src="app.js"></script>
</body>
这是我的 JS
angular.module('AB', ['A1', 'B1']);
angular.module('A1', ['A2']);
angular.module('A2', ['A3']);
var a3 = angular.module('A3', []);
angular.module('B1', ['B2']);
angular.module('B2', ['B3']);
var b3 = angular.module('B3', []);
b3.service('b3service', function(){
this.getSecretMessage = function(){
return 'Cows are Flying...';
};
})
a3.run(function(b3service){
console.log(b3service.getSecretMessage());
});
我的结论
我认为魔法在嵌套模块中。这就是为什么在问题view1
中显示的代码模块和view2
模块可以相互访问。因为视图已嵌套在body
内,所有模块的父级myApp
都是通过它自举的。
令人困惑的事实......
我的头还在旋转......:P
答案 1 :(得分:0)
在控制器中声明依赖项,如果将author,view1_var和serviceV1添加到两个控制器,则两个控制器都可以看到它们。
在两者中呈现view1_var表明view1_var确实'作为全局值。至于为什么会这样,我不知道。然而,第二个价值宣言肯定是第一个。
'use strict';
var myApp = angular.module('myApp', ['ngRoute', 'myApp.view1', 'myApp.view2']);
myApp.config(['$routeProvider', function($routeProvider) {
$routeProvider.otherwise({redirectTo: '/view1'});
}]);
myApp.value('author', 'Suman Barick');
var myApp1 = angular.module('myApp.view1', ['ngRoute']);
var myApp2 = angular.module('myApp.view2', ['ngRoute']);
myApp1.value('view1_var', 'Hi, view 1');
myApp2.value('view1_var', 'Hi, VIEW 2');
myApp1.config(['$routeProvider', function($routeProvider) {
$routeProvider.when('/view1', {
template: 'Welcome to view ONE',
controller: 'View1Ctrl'
});
}]);
myApp2.config(['$routeProvider', function($routeProvider) {
$routeProvider.when('/view2', {
template: 'Welcome to view TWO',
controller: 'View2Ctrl'
});
}]);
myApp1.service('serviceV1', function(){
this.getData = function(){return 'abcdef';}
console.log('This is a service from myApp.view1 module');
});
myApp1.controller('View1Ctrl', ['author','view1_var','serviceV1', function(author, view1_var, serviceV1) {
console.log('*******************************************');
console.log('I am on view1 module');
console.log('Printing author value from myApp module ' + author);
console.log(view1_var);
console.log(serviceV1.getData());
console.log('*******************************************');
}]);
myApp2.controller('View2Ctrl', ['author', 'view1_var','serviceV1', function(author, view1_var, serviceV1) {
console.log('*******************************************');
console.log('Look I am accessing view1_var and serviceV1 of view1 module... from view2 module');
console.log('Printing author value from myApp module ' + author);
console.log(view1_var);
console.log(serviceV1.getData());
console.log('*******************************************');
}]);