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