Когда использовать вложенные контроллеры вместо сервисов в angularjs?

Я только начал использовать AngularJS, поэтому я не эксперт.

У меня есть div, представляющий правильную область моего html-представления. В этом div у меня есть контроллер, т.е.

<div class="rightContainer" ng-controller="rightContainerCtrl">...</div>

Внутри этого div у меня есть таблица, область поиска и т.д. Каждая область внутри этого div имеет свои собственные контроллеры, она выглядит так:

<div class="rightContainer" ng-controller="rightContainerCtrl">
...
   <div class="search" ng-controller="searchCtrl">...</div>
...
   <div class="table" ng-controller="tableCtrl">...</div>

 </div>

область поиска, например, имеет свой собственный контроллер, и это дочерний элемент rightContainerCtrl, потому что ему нужно изменить некоторый контент в родительском (rightContainerCtrl), но divContainer div растет, а теперь он большой и содержит несколько вложенных контроллеров.

Я думаю, что использование этих вложенных контроллеров в этом контексте плохо, потому что все вложенные контроллеры совместно используют родительскую область, и не всем контроллерам необходимо получить доступ ко всем переменным родительской области, а также все контроллеры являются "заключенными" rightContainerCtrl, поэтому они сильно связаны с родительским контроллером.

Похоже на объект God анти-шаблон (в этом случае контроллер Бога), поэтому я думаю, что вместо использования вложенных контроллеров я могу рефакторируйте мой код, чтобы устранить контроллер rightContainerCtrl и вместо этого используйте службу (например, в шаблоне проектирования фасадов), эта служба будет использоваться контроллерами вместо совместного использования переменных области.

но поскольку я не эксперт по AngularJs, я не уверен, что я прав, или если лучше оставить этот родительский контроллер, возможно, я что-то упустил, поэтому мой вопрос

Когда лучше использовать вложенные контроллеры (вложенные области) и когда лучше использовать сервисы вместо angularjs?

Ответ 1

Иерархия контроллера/области не должна диктовать, как данные/модели разделяются в приложении. Когда вы думаете о совместном использовании данных в Angular, подумайте об инъекции зависимостей.

В видео, которое упоминается в ансамблере @shaunhusain, Misko заявляет, что область действия должна относиться к модели, а не модель, поэтому не моделируйте/не помещайте свои данные в области видимости. Ваши модели/данные обычно должны находиться в сервисе.

При написании приложения Angular сначала подумайте о своих моделях. Поместите их в услуги с API-интерфейсами для получения/редактирования/управления моделями. Затем создайте свои представления. Каждое представление должно проектировать/использовать/манипулировать некоторым подмножеством ваших моделей. Определите контроллер для каждого вида, который просто приклеивает необходимое подмножество моделей к представлению. Сделайте свои контроллеры как можно более тонкими.

(Именовать контроллер rightContainerCtrl также не рекомендуется. Контроллер не должен знать о представлении/макете.)

Ответ 2

Это 100% -ый вызов суждения и должен основываться на нескольких пунктах.

Использование событий создает чрезвычайно слабо связанные компоненты, им буквально не нужно знать друг о друге, если у вас есть ситуация, когда какой-то родительский контроллер будет облегчать связь между кучей контроллеров (через службы), то это вероятно, лучшее решение.

Однако, если вы все в порядке с контроллерами, каждый в зависимости от службы (на самом деле это не проблема), вы можете просто использовать эту услугу в качестве средства обмена изменениями между контроллерами. Я видел множество аргументов против синглтона (из которых сервис - это аромат, инъецированный синглтон, но, тем не менее, один синглтон). Я считаю, что эти аргументы в основном носят спорный характер и, как правило, не имеют действительно элегантного и лаконичного решения. Если аргумент разрывается и продолжается о том, как, когда вы идете с A-D, вы не хотите ехать по дороге B, но они никогда не предлагают дорогу C. Я действительно не вижу смысла.

http://www.youtube.com/watch?v=ZhfUv0spHCY&t=30m34s

Я не смог найти точную точку в видео, но где-то в конце здесь он обсуждает использование контроллеров и служб (он также рассматривает привязку двунаправленных данных, которая не позволит вам загрязнять глобальную область, поэтому говорить).