что можно или нельзя сделать с контроллером, созданным в модуле, против контроллера, созданного глобально?

Я видел различные примеры angular JS, и я понял, что мне следует определять контроллеры в модуле, а не в глобальном определении.

Скажем, у меня есть приложение, которое имеет <body ng-app='mymodule'> внутри тела, оно может подтверждать контроллеры, созданные в mymodule, и контроллеры, созданные глобально.

  1. Контроллер, определенный в модуле, не будет иметь доступа ни к каким глобальным переменным по сравнению с глобальным контроллером. Верно/неверно?
  2. Любые другие важные моменты, которые следует отметить здесь?

person dotnetcoder    schedule 14.08.2013    source источник


Ответы (1)


Контроллер, определенный в модуле, не будет иметь доступа ни к каким глобальным переменным по сравнению с глобальным контроллером. Истинный ?

ЛОЖЬ. Глобальные переменные, ну, глобальные. Вы можете получить к ним доступ из контроллера, но не должны этого делать, если только вас не беспокоит тестирование — а оно определенно должно быть.

Любые другие важные моменты, которые следует отметить здесь?

Глобальный контроллер не может использовать сервисы из других модулей, кроме самого Angular. Если вы хотите использовать компоненты, определенные в других модулях (директивы, фабрики, провайдеры и т. д.), вам придется создать свой собственный модуль и объявить их как зависимости, чтобы вы могли внедрять нужные биты туда, где они вам нужны.

Единственное использование глобального контроллера, IMO, — это демонстрация Angular простым и понятным способом. Не используйте его в производстве.

Обновить

Как указал @dotnetcoder в комментариях, по-видимому, из-за того, как Angular загружает модули, глобальный контроллер может фактически получить доступ к службам из модуля, если этот модуль уже загружен фреймворком. Я исправляюсь. Но, хотя технически это возможно, я не могу придумать ни одной причины, по которой кто-то должен это делать, и я поддерживаю то, что сказал ранее: не используйте глобальные контроллеры в производстве.

person Michael Benford    schedule 14.08.2013
comment
на самом деле (и к моему удивлению) кажется, что глобальный контроллер может получить доступ к службам из модуля. Я поместил этот пример jsfiddle, который обращается к фабрике в глобальном контроллере jsfiddle.net/JrXeb - person dotnetcoder; 14.08.2013
comment
Мне пришлось копаться в исходном коде Angular, чтобы понять, что здесь происходит. Если я правильно понял, Angular сначала загружает модуль, определенный в атрибуте ng-app, вместе со всеми его зависимостями. Затем он обрабатывает директиву ng-controller и пытается разрешить зависимости контроллера, просматривая все ранее загруженные службы. Если он находит все необходимое для выполнения контроллера, он это делает. Это неожиданно, по крайней мере для меня. Думаю, мне следует перестать читать документы и начать изучать исходный код Angular. :) - person Michael Benford; 14.08.2013