为什么 2 个不同的模块在添加为依赖于第三个模块时可以相互访问?
Why 2 different Module can access each other when added as depend to third module?
我的 AngularJS 应用程序中有 3 个 模块 ,例如main
、home
和 product
。 main
模块具有 home
和 product
模块作为依赖项(ng.module('main', ['home', 'product'])
),而 home
和 product
模块没有任何依赖项(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 已经定义了控制器。
所以这不仅仅是可见性的问题,也是可维护性和命名的问题。
模块上定义的所有内容都是 public。
之所以有效,是因为 home
模块的依赖项已添加到 main
模块中,并且由于 main
仅调用 product service
因此它应该仅依赖于product
模块。
如果您从 main
模块中删除 home
模块依赖项(应该如此),它将停止工作。
TLDR;不将 home
依赖项添加到 product
模块的不利方面是它不会仅通过添加产品依赖项来工作,但您还必须添加 home
依赖项才能使用 product service
.
我的 AngularJS 应用程序中有 3 个 模块 ,例如main
、home
和 product
。 main
模块具有 home
和 product
模块作为依赖项(ng.module('main', ['home', 'product'])
),而 home
和 product
模块没有任何依赖项(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 已经定义了控制器。
所以这不仅仅是可见性的问题,也是可维护性和命名的问题。
模块上定义的所有内容都是 public。
之所以有效,是因为 home
模块的依赖项已添加到 main
模块中,并且由于 main
仅调用 product service
因此它应该仅依赖于product
模块。
如果您从 main
模块中删除 home
模块依赖项(应该如此),它将停止工作。
TLDR;不将 home
依赖项添加到 product
模块的不利方面是它不会仅通过添加产品依赖项来工作,但您还必须添加 home
依赖项才能使用 product service
.