29

据我所知,AngularJS 是当今最有趣的库之一。我正在慢慢了解 Angular 的力量,我非常喜欢它。我有一些疑问,我希望我能澄清它们。即使经过一些背景工作,我也无法理解它们是如何完成的

  1. 例如,我的应用程序中有一个模块,我为它编写了指令,我想向我的应用程序添加更多模块,并且还想重用为另一个模块编写的现有指令。我怎样才能做到这一点。不仅适用于过滤器、配置等的模块。

  2. 我可以在模块中定义子模块吗?

  3. 如何动态地将控制器添加到元素,它不应该是静态的,即通过 html 标记ng-controller

  4. 如果我想在所有模块之间共享一个东西,我该怎么做。例如,我在我的应用程序的所有模块之外定义了一个变量,我只想在模块内部访问它们。这可能吗,我有这个疑问因为它完全适用于单个作用域、共享作用域和 rootScope 等。

任何帮助,将不胜感激。

4

3 回答 3

51

问:例如,我的应用程序中有一个模块,并且我为它编写了指令,我想向我的应用程序添加更多模块,并且还想重用为另一个模块编写的现有指令。我怎样才能做到这一点。不仅适用于过滤器、配置等的模块。

当你声明一个模块时,你指定它的依赖。因此,如果您有这样的指令:

angular.module( 'moduleA', [] )

.directive( 'myDirective', function () {
  // ...
});

您可以从另一个模块中要求该模块:

angular.module( 'moduleB', [ 'moduleA' ] );

数组参数 toangular.module是依赖项列表。

问:我可以在模块中定义子模块吗?

模块在技术上都是独立的,但伪造它是非常普遍的。所以我们可以moduleA像这样定义它的“子模块”:

angular.module( 'moduleA.one', [] );
angular.module( 'moduleA.two', [] );

angular.module( 'moduleA', [
  'moduleA.one',
  'moduleA.two'
]);

开发人员/读者很清楚moduleA.onemoduleA.two是 的一部分moduleA,而且任何时候另一个模块依赖于moduleA,它的两个子模块也将被包括在内。

但从技术上讲,这些都是独立的,所以如果它想这样做moduleB也可能需要。moduleA.two

问:如何动态添加控制器到元素,它不应该是静态的,即通过 html 标记 ng-controller。

这可能不是一个好主意。“观点”是官方记录。你的用例是什么?

问:如果我想在所有模块之间共享一个东西,我该怎么做。例如,我在我的应用程序的所有模块之外定义了一个变量,我只想在模块内部访问它们。这可能吗,我有这个疑问是因为它完全适用于单个作用域、共享作用域和 rootScope 等。

我不确定我明白你在问什么。但是,当您在模块中定义某些内容时,您可以通过要求它从任何其他地方访问它,如上所述。但是在 AngularJS 应用程序中,应该有所有模块之外”的任何东西——所有东西都应该在一个模块中,因为否则它就定义在全局范围内(例如window),这是一种不好的做法。


为了更好地了解如何构建模块以获得巨大的利益,请查看我的ngBoilerplatekickstarter: http: //ngbp.github.io/ngbp/。模块结构专为代码重用而设计,并在实践中演示了其中的许多概念。

随意详细说明其中任何一个,我将修改回复。

于 2013-03-03T20:36:56.413 回答
5

最简单的方法

最简单的方法是将所有可共享的指令和其他部分添加到ng模块。

angular
    .module("ng")
    .directive("myDirective", function() {
        ...
    })
    .filter("MyFilter", function() {
        ...
    });

这是最简单的方法(一种set and forget),因为您可以轻松地将指令脚本放到 HTML 中,然后在开发自然也需要它的新模块时忘记它。

这种技术还有什么好处

为什么向ng模块添加可共享的东西是明智的?因为您的应用程序中可能有简单的页面,这些页面没有定义特定的ngApp模块,而只是ng-app在 HTML/BODY 上设置并仅运行内联角度指令。

当您将指令添加到ng模块时,这些页面也可以使用您的指令。

<html>
    <body ng-app>
        <div my-directive>
        ...
        </div>
    </body>
</html>
于 2014-02-07T16:00:53.520 回答
0

您不能在应用程序的开头创建一个 div 以便其范围与您的需要一样大吗?

<div ng-controller="uberController as uber">

    ....

    other controllers and html code here

    ....
</div>

uber div 内的任何东西都可以使用 uber 控制器。

于 2014-07-25T18:05:18.763 回答