[英]Why does Angular (1.x) allow a module's dependency to reference its components?
考虑以下代码:
angular.module('app', ['app.core']) .factory('NameService', function() { return { getName: function() { return 'Omar' ;} }; }); angular.module('app.core', []) .controller('MainController', function($scope, NameService) { $scope.name = NameService.getName(); });
<body ng-app="app"> <div ng-controller="MainController"> {{name}} </div> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.0/angular.min.js"></script> </body>
结果显示“ Omar”。 但是请注意, NameService
是在app
模块中定义的,而不是app.core
模块的依赖项。 我了解彼此之间是圆形的,但是为什么这样做有效?
本质上,每个角度应用程序都具有单个$injector
。 注册依赖项后,其签名将添加到$injector.modules
Array中。 调用特定的依赖项时,将从数组中检索其签名。 $injector
不会根据注册的来源来限制对modules
数组的访问; 任何已注册的依赖项在应用程序中随处可见。
这是Angular 1.x中的设计缺陷。 之所以可以使用它,是因为Angular会保留所有服务,控制器,工厂,指令等的全局注册表。 “安装”模块意味着使用其名称作为字符串键将其所有内容放入全局注册表。 因此,只要某个模块没有注册其依赖项,它仍然可以工作。
实际上,这是大型Angular应用程序中常见的错误源,因为您最终可能会在不知道的情况下使用未声明的依赖项,因此重新组织应用程序的模块结构将以明显的方式破坏事物。
在这方面, Angular 2的模块系统更好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.