2015-06-01 2 views
6

У меня есть 3 модулей в моем AngularJS Приложение, например. main, home и product. main модуля, имеющий home и product модуля в качестве зависимостей (ng.module('main', ['home', 'product'])), а home и product модулей, не имеющие какие-либо зависимостей (ng.module('product', [])ng.module('phome', [])), по-прежнему product модуль доступа home сервисного модуля? ЗАЧЕМ???Почему 2 разных модуля могут обращаться друг к другу при добавлении в зависимости от третьего модуля?

Ниже приведен пример кода приложения, который имеет тот же сценарий и ту же проблему. И это 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> 
+1

Это потому, что обслуживание на дому получает определяется как глобальная переменная, которая может быть доступна из любой точки в пределах приложения. Попробуйте прочитать http://tutorials.jenkov.com/angularjs/dependency-injection.html для получения дополнительной информации. – vipulsharma

ответ

3

Ответ довольно простой. Угловое не распространяется на содержимое модуля на сам модуль. Я где-то читал, что были обсуждения добавления этой функции, но я еще не видел ее реализованной.

Хуже того, контроллеры, применяемые к одному импортированному модулю, будут уникальными в вашем приложении. В качестве примера я когда-то использовал угловую бутстрап, и кто-то из моей команды добавил AlertController. Мы были очень смущены, когда контроллер никогда не попадал, но это было потому, что угловой-ui уже определил контроллер.

Таким образом, речь идет не только о видимости, но и о ремонтопригодности и наименовании.

Все, что определено в модуле, является общедоступным.

+0

Это так страшно. К счастью после 1,5 лет угловатости, мне еще предстоит столкнуться с этой проблемой. – mmmeff

+0

Я, кажется, вспоминаю стандарт 'NameCtrl', исходящий из этой проблемы, чтобы избежать столкновения с' NameController' из сторонних библиотек. Это действительно ударило в мою команду три или четыре раза, пока мы не заявили, что согласны с «NameCtrl». –

0

Это работает, потому что зависимость home модуля добавляется в main модуль и, как main только называя product service поэтому оно должно зависеть только от product модуля.

Если вы удалите модуль зависимости home модуля main (это должно быть так), он перестает работать.

TLDR; Нижняя сторона не добавляя зависимость home к модулю product заключается в том, что она не будет работать, только добавив зависимость продукта, но вы должны добавить зависимость home, а также работать с product service.

jsfiddle