为什么两个不同的模块可以相互访问时,添加依赖于第三个模块

Why 2 different Module can access each other when added as depend to third module?

本文关键字:模块 访问 添加 三个 依赖于 两个 为什么      更新时间:2023-09-26

我在我的AngularJS App中有3个模块,例如main, homeproductmain模块具有homeproduct模块作为依赖关系(ng.module('main', ['home', 'product'])),而homeproduct模块没有任何依赖关系(ng.module('product', []) ng.module('phome', [])),仍然product模块可以访问home模块服务?为什么? ?

下面是我的应用程序的示例代码,它具有相同的场景和相同的问题。这是JSfiddle Link。

<!DOCTYPE html>
<html ng-app="main">
<body ng-controller="MainController as mainController">
{{mainController.name}}
<script type="application/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
<script>
(function (ng) {
    var homeModule = ng.module('home', []);
    homeModule.service("HomeService", [function () {
        var homeService = this;
        homeService.getName = function () {
            return "Home Service";
        }
    }]);
    var productModule = ng.module('product', []);
    productModule.service("ProductService", ["HomeService", function (HomeService) {
        var productService = this;
        productService.getName = function () {
            return "Product Service - " + HomeService.getName();
        };
    }]);
    var mainModule = ng.module('main', ['home', 'product']);
    mainModule.controller("MainController", ['ProductService', function (ProductService) {
        var mainController = this;
        mainController.name = ProductService.getName();
    }]);
})(angular);
</script>
</body>
</html>

答案很简单。Angular不会把模块的内容作用域限定在模块本身。我在某个地方读到有关于添加此功能的讨论,但我还没有看到它实现。

更糟糕的是,应用于一个导入模块的控制器在你的应用中是唯一的。例如,我曾经使用angular-ui bootstrap,我的团队中有人添加了一个AlertController。当控制器从未被击中时,我们很困惑,但这是因为angular-ui已经定义了控制器。

所以这不仅仅是可见性的问题,也是可维护性和命名的问题。

它工作是因为home模块的依赖关系被添加到main模块,而main只调用product service,因此它应该只依赖于product模块。

如果你从main模块中移除home模块依赖(应该是这样),它会停止工作。

TLDR ;不将home依赖项添加到product模块的缺点是,仅添加产品依赖项将无法工作,但您必须添加home依赖项才能与product service一起工作。

jsfiddle