В моем бесконечном квесте, чтобы сделать "правильный" angular способ, я много читал о том, как контроллеры наблюдают изменения в моделях, хранящихся в службах angular.
Некоторые сайты говорят, что использование $watch на контроллере категорически неверно:
НЕ используйте $watch в контроллере. Трудно проверить и совершенно ненужно почти в каждом случае. Используйте метод в области, чтобы обновить значения (ы), которые часы меняют.
Другие кажутся прекрасными, если вы сами очищаете себя:
Функция $watch сама возвращает функцию, которая будет отпереть $watch при вызове. Итак, когда часы $watch больше не нужны, мы просто вызываем функцию, возвращаемую $watch.
Есть вопросы qaru.site/info/182070/... и другие уважаемые сайты, которые, как говорят, правы что использование $watch в контроллере - отличный способ заметить изменения в поддерживаемой angular -сервисной модели.
https://github.com/angular/angular.js/wiki/Best-Practices сайт, который, я думаю, мы можем дать немного больше веса, прямо говорит, что $scope. $watch следует замените необходимость в событиях. Однако для сложного SPA, который обрабатывает более 100 моделей и конечных точек REST, выбор использования $watch для предотвращения событий с $broadcast/$emit
может закончиться лотами часов. С другой стороны, если мы не используем $watch, для нетривиальных приложений мы заканчиваем тонны спагетти событий.
Это потерять/потерять ситуацию? Это ложный выбор между событиями и часами? Я знаю, что вы можете использовать двухстороннюю привязку для многих ситуаций, но иногда вам просто нужен способ прослушивания изменений.
ИЗМЕНИТЬ
Комментарий Илана Фрумера заставил меня переосмыслить то, о чем я прошу, поэтому, возможно, вместо того, чтобы просто спросить, хорошо ли/плохо использовать часовые часы в контроллере, позвольте мне задать вопросы следующим образом:
Какая реализация, скорее всего, создаст узкое место производительности? Наличие контроллеров для прослушивания событий (которые должны были транслироваться/выбрасываться) или настройки $watch
-es в контроллерах. Помните, крупномасштабное приложение.
Какая реализация сначала создает головную болью обслуживания: $watch
-es или события? Возможно, существует связь (тугая/свободная) в любом случае... наблюдатели за событиями должны знать, что слушать, а $watch
-es по внешним значениям (например, MyDataService.getAccountNumber()
) должны знать о вещах, происходящих вне их $сфера.
** EDIT через год **
Angular сильно изменился/улучшился с тех пор, как я задал этот вопрос, но я все еще получаю +1, поэтому я подумал, что хочу упомянуть, что при просмотре командного кода angular я вижу шаблон, когда он приходит к наблюдателям в контроллерах (или директивах, где есть область, которая уничтожается):
$scope.$on('$destroy', $scope.$watch('scopeVariable', functionIWantToCall));
Что это делает, что возвращает функция $watch - функция, которую можно вызвать, чтобы отменить регистрацию наблюдателя - и передать ее обработчику события, когда контроллер будет уничтожен. Это автоматически очищает наблюдателя.
Если часы в контроллерах являются запахами кода или нет, если вы их используете, я полагаю, что использование этого шаблона в angular должно служить сильной рекомендацией по их использованию.
Спасибо!