模块如何访问另一个模块,即使它没有依赖项

时间:2014-10-29 12:21:17

标签: angularjs angularjs-module

我对模块如何加载角度有点困惑。以下面的代码为例:

var app = angular.module("app", [ "app.widgets", "app.core"]);


    var core = angular.module("app.core", []);
    core.factory("foo", function(){
      return {
        ping: function(){
         return "pong";
        }
      }
    });

    var widgets = angular.module("app.widgets", []);
    widgets.controller("WidgetController", function($scope, foo){
      $scope.items = [1,2,3,foo.ping()];
    });

<body ng-app="app">
  <ul ng-controller="WidgetController">
    <li ng-repeat="item in items">
      {{item}}
    </li>
  </ul>
</body>

我对我的&#34; app.widgets&#34;模块可以访问&#34; app.core&#34;尽管模块没有被声明为依赖项。

似乎正在接受依赖,因为&#34; app.widgets&#34;和&#34; app.core&#34;在第三个模块中声明 - 非常方便。但它对我来说似乎并不直观。

所以我想我的问题是&#34;两个模块会知道&#39;如果他们在第三个模块中宣布彼此?&#34;。这是记录在案的行为吗?

2 个答案:

答案 0 :(得分:3)

您已在应用模块中添加了两个模块,即[ "app.widgets", "app.core"],然后您正在使用应用内的WidgetController。虽然您没有对app.widgets模块做出任何明确的依赖,但您仍然可以从应用程序模块中的模块app.core访问工厂foo,因为您的应用模块依赖于app.core。 如果你试试,

<body ng-app="widgets ">
  <ul ng-controller="WidgetController">
    <li ng-repeat="item in items">
      {{item}}
    </li>
  </ul>
</body>

这不会起作用,因为ng-app="widgets"中没有像工厂foo那样的内容。 因此,为了理解,将app模块视为模块[ "app.widgets", "app.core"]的容器,您可以在其中访问所有控制器,工厂等,就好像它们是应用程序模块本身的一部分一样。

答案 1 :(得分:2)

我认为它是这样的:

1)“app”注入了“app.core”,因此所有“app.core”服务,工厂等都可用于“app”模块。

2)进入“app”模块,你还会注入“app.widgets”,然后可以访问“app”模块可以访问的所有内容。

所以:app可以访问app.core&amp;&amp; app.widgets可以访问app - &gt; app.widgets可以访问app.core

我不确定它是否记录在某处,如果是,我很乐意阅读它。 查看此脚本以获得更多有趣的内容:

http://plnkr.co/edit/Z8cZHJTekUa68eXuiCmW?p=preview

似乎父模块上声明的foo不会被来自子模块的foo覆盖。 如果注入的模块都有foo,则使用后者:

var app = angular.module("app", [ "app.core", "app.widgets"]);

使app.widgets.foo成为app.foo app.core.foo。它会覆盖app.core.foo!