如果一个模块无论如何都可以从另一个模块访问值和服务,那么声明角度模块依赖性的重点是什么

时间:2016-05-16 09:07:16

标签: javascript angularjs dependency-injection

请参阅this plunker code通知console.log消息)以了解我想说/要求的内容。

我定义了3个模块,即myAppmyApp.view1myApp.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('*******************************************');
}]);

我的疑问/问题:

  1. 为什么" myApp.view1"模块访问"作者"在" myApp"上定义的值模块。 "对myApp"依赖于" myApp.view1",但反之亦然。

  2. 更有趣的是," myApp.view1"和" myApp.view2"是2个完全独立的模块。然后怎么来" myApp.view2"从" myApp.view1"访问view1_varserviceV1甚至没有声明对它的任何依赖?

  3. 这是预期的设计/行为吗?那么我可以在一个模块中定义的其他内容是什么,但在任何其他模块中使用它而不管它们之间的依赖性如何?

  4. 有人可以解释一下吗?

2 个答案:

答案 0 :(得分:2)

经过一番研究后,感谢@dewd指出我接受this question的答案,我来到后面的结论

所以,这里有我的定理 [见下图说明]

  

如果

     
      
  1. 存在n个模块命名A1,A2,A3,...,An,A1取决于A2,A2取决于A3等......
  2.   
  3. 另外,m模块命名为B1,B2,B3,.... Bm,B1取决于B2,B2取决于B3等......
  4.   
  5. 还存在一个顶级(est)级依赖模块,比如'AB',它依赖于模块'A1'和'B1'
  6.   
  7. 然后,模块'An'将能够访问任何   模块'Bm'上声明的服务
  8.   

插图图片

enter image description here

实验和证明

请参阅此plunkr了解演示。

这里我已经宣布了7个模块,

  1. 模块A1,A2,A3其中,A1取决于A2,A2取决于A3
  2. 模块B1,B2,B3其中,B1取决于B2,B2取决于B3
  3. 模块'AB',它取决于'A1'和'B1'
  4. 现在,

    1. 我已在b3service模块
    2. 上定义了服务B3
    3. 我已经使用正文
    4. 引导AB模块
    5. 现在我可以从模块b3service访问A3(请参阅控制台消息)
    6. 但是,A3B3没有直接关联或依赖关系。

      这是我的 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('*******************************************');
}]);