角度如何解析模块中定义的控制器

How does angular resolve controllers defined in modules?

本文关键字:定义 控制器 模块 何解析      更新时间:2024-06-11

查看控制器的角度文档,有一些东西让我感到困惑。假设有人这样做:

angular.module('foo').controller('controller1', ['$scope', function($scope) { 
});

和:

<div ng-app='app' ng-controller='controller1'>
</div>

angular如何知道'controller1'驻留在模块`o'中?

此外,如果有人这样做:

angular.module('bar').controller('controller1', ['$scope', function($scope) { 
});

angular现在会选择哪一个?

当您在此处声明ng-app时:

<div ng-app='app' ng-controller='controller1'>
</div>

Angular将查找名称为app的模块定义。类似这样的东西:

angular.module('app', []);  // notice the []

在第二个参数[]数组中,Angular想要依赖模块。因此,为了从foo模块中包含controller1,您需要执行以下操作:

angular.module('app', ['foo']);

来自bar模块:

angular.module('app', ['bar']);

在每一个中,只有一个名为controller1的控制器。

那么,当您同时注册foobar模块时会发生什么呢?我认为最后一个会赢。因此,如果您将app定义为:

angular.module('app', ['foo', 'bar']);

然后,bar模块的controller1将覆盖注入器内的名称controller1

因此,没有允许在模块之间应用相同名称的内置机制。因此,您可以使用命名方案来确保控制器是唯一的:

angular.module('bar').controller('bar.controller1', ['$scope', function($scope) { 
});

angular如何知道"controller1"驻留在模块"foo"中?

Angular在解析controller1时,不知道它在哪个模块中。一旦模块是依赖的(依赖于ng-app中定义的模块),所有控制器(在所有模块中)都只解析其名称。

Angular并不知道控制器的来源。您的申请包括foobar,然后注册controller1

如果同时包含foobar,则controller1来自上次包含的任何模块。