Сервис> Контроллер> Директива против Сервиса> Директива

Я хочу получить некоторые рекомендации по передовым методам в отношении того, как я должен выполнять свою директиву.

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

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

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

Для большинства моих директив до сих пор я следовал шаблону, в котором у меня есть служба, которая ведет переговоры с REST API и вводится в мой контроллер представления. Я добавляю эти данные в область действия, а затем передаю эти данные в свою область выделения директивы, для директивы для обработки.

Было бы что-то неправильно, если бы директива напрямую говорила об услуге и просто использовала собственный контроллер для передачи данных на него? Таким образом, по существу он оставался бы полностью независимым от контроллера вида.

Надеюсь, у меня есть смысл,

Благодарю.

2 ответа

Я не вижу никаких проблем с этим. Мы реализовали несколько таких директив. По сути, у вас есть многократно используемая функциональность, которая выполняет некоторые "вещи", и этот материал должен сохраняться последовательным образом. Наличие директивы, связывающей службу, отлично, когда директива существует явно для этой службы. Что действительно приятно в этом подходе, так это то, что контроллеры и другие сервисы в вашем приложении не должны знать о реализации пользовательского интерфейса или что директива даже существует - все они могут добавлять элементы в корзину или получать информацию просто путем общения через оказание услуг.

Я применил аналогичный подход в своем эмуляторе T6502 (http://t6502.codeplex.com/) - есть консольная директива, которая взаимодействует с консольной службой. Директива использует сервис для визуализации строк, но все остальное в приложении просто разговаривает с сервисом.


Для большинства моих директив до сих пор я следовал шаблону, в котором у меня есть служба, которая ведет переговоры с REST API и вводится в мой контроллер представления. Я добавляю эти данные в область действия, а затем передаю эти данные в свою область выделения директивы, для директивы для обработки.

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

Существует третий способ, который я недавно применял для получения данных в директиве от службы. Передача функции (через '&'), которая указана в элементе директивы, которая извлекает данные из службы. В моем случае это был виджет поиска. Упрощенная форма:

.directive('search', function () {
 return {
 restrict: 'E',
 scope: {
 'searchSource': '&',
 'ngModel': '='
 }

Используется в качестве:

А в контроллере вида что-то вроде

$scope.search = function(searchTerm) {
 return UserModel.findBySearchTerm(searchTerm);
};

Функция UserModel.findBySearchTerm возвращает обещание, с которым может справиться директива.

Сюда:

  • Контроллер все еще может не знать, как/когда виджет использует данные.
  • Контроллер может повлиять на возвращаемые данные, если это необходимо. Скажем, чтобы обеспечить предварительную фильтрацию результатов. Это можно сделать без настройки самой директивы.
  • При необходимости контроллер может запрашивать данные из другой службы.
  • Из-за вышеизложенного директива несколько более многоразовая. Пока вы можете дать ему функцию, которая возвращает обещание, которое решает данные в определенной форме, оно может показывать результаты из любого места.

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

Мой виджет поиска немного отличается от вашего случая: результаты поиска немного "временны", поскольку они просто используются виджетами для установки ng-модели, которая затем сохраняется в контроллере.

Чтобы вернуться к вашему вопросу

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

Нет, и у меня есть "высокоуровневые" директивы, которые это делают. Тем не менее, я обычно имею одну директиву достаточно высокого уровня для каждого маршрута (/feature) (который ведет себя как контроллер представления), который ведет переговоры с службами, настраивает переменные области видимости и, что особенно важно, для сбора данных из служб. Затем в шаблоне он настраивает все директивы, которые он использует, используя атрибуты, передавая эти переменные + функции.

licensed under cc by-sa 3.0 with attribution.