Когда использовать 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), но div rightContainer растет, и теперь он большой, и содержит несколько вложенных контроллеров.
Я думаю, что использование этих вложенных контроллеров плохо в этом контексте, потому что все вложенные контроллеры совместно используют родительскую область видимости, и не всем контроллерам требуется доступ ко всем родительским переменным области видимости, также все контроллеры являются "пленниками" rightContainerCtrl, поэтому они тесно связан с их родительским контроллером.
Он выглядит как анти-шаблон объекта God (в данном случае - контроллер God), поэтому я думаю, что вместо использования вложенных контроллеров я могу реорганизовать свой код, чтобы исключить контроллер rightContainerCtrl и использовать вместо него службу (как в шаблоне проектирования фасада), эта служба затем будет использоваться контроллерами вместо совместного использования переменных области видимости.
но так как я не эксперт AngularJs, я не уверен, прав ли я или лучше оставить этот родительский контроллер, может быть, я что-то упустил, поэтому мой вопрос
Когда лучше использовать вложенные контроллеры (вложенные области видимости), а когда лучше использовать сервисы в angularjs?
2 ответа
Иерархия контроллера / области не должна определять, как данные / модели используются в приложении. Когда вы думаете об обмене данными в Angular, подумайте о внедрении зависимости.
В видео, на которое есть ссылка в ответе @ shaunhusain, Миско заявляет, что область действия должна ссылаться на модель, а не на модель, поэтому не моделируйте / не помещайте свои данные в области. Ваши модели / данные обычно должны быть в сервисе.
При написании приложения Angular сначала подумайте о своих моделях. Поместите их в сервисы с API для получения / редактирования / манипулирования моделями. Тогда разработайте свои взгляды. Каждое представление должно проецировать / использовать / манипулировать некоторым подмножеством ваших моделей. Определите контроллер для каждого вида, который просто склеивает необходимое подмножество моделей в вид. Сделайте ваши контроллеры максимально тонкими.
(Называя контроллер rightContainerCtrl
Также не рекомендуется. Контроллер не должен знать о представлении / макете.)
Это 100% суждение, и оно должно основываться на нескольких моментах.
Использование событий создает чрезвычайно слабо связанные компоненты, они буквально не должны знать друг о друге. Если у вас есть ситуация, когда какой-либо родительский контроллер устраняет необходимость взаимодействия между группой контроллеров (через сервисы), тогда, вероятно, лучше решение.
Однако, если у вас все в порядке с контроллерами, каждый из которых зависит от сервиса (на самом деле это не проблема), вы можете просто использовать сервис как средство передачи изменений между контроллерами. Я видел множество аргументов против синглтона (из которых сервис - это разновидность, внедренный синглтон, но, тем не менее, синглтон). Я нахожу эти аргументы в основном спорными и, как правило, не хватает действительно элегантного и лаконичного решения. Если спор идет о том, как, когда вы уходите с A - D, вы не хотите ехать по дороге B, но они, кажется, никогда не предлагают дорогу C I, на самом деле не вижу смысла.
http://www.youtube.com/watch?v=ZhfUv0spHCY&t=30m34s
Я не смог найти точную точку в видео, но где-то в конце здесь он обсуждает использование контроллеров против сервисов (он также рассматривает двунаправленную привязку данных, которая избавит вас от необходимости загрязнять, так сказать, глобальную область),