Какова лучшая практика, когда директива AngularJS имеет много привязок в своей изолированной области?
Предположим, что каждая директива по карточному предмету должна знать много внешних контекстов и действовать соответственно.
Мы могли бы создать сервис для мониторинга внешнего мира и добавить сервис в директиву элемента карты, например:
scope: {
item: '=',
service: '=',
}
<card-item item="card"
service="ItemService">
</card-item>
Это кажется плохой практикой, потому что директива слишком много знает о сервисе (например, вызывает функции сервиса внутри директивы).
Многие посты о лучших практиках AngularJS предполагают изоляцию, например, следующие.
Но это все еще не чувствует себя здесь:
scope: {
item: '=',
isSelected: '&',
inSelectMode: '&',
inMoldMode: '&',
onToggleSelect: '&',
onTogglePreview: '&',
onToggleSort: '&',
onDelete: '&',
isPreviewing: '&',
isSorting: '&',
locales: '=',
printUrl: '=',
}
<card-item item="card"
is-selected="ItemService.isSelected(card)"
in-select-mode="ItemService.inSelectMode()"
in-mold-mode="ItemService.inMoldMode()"
on-toggle-select="ItemService.toggleSelect(card)"
on-toggle-preview="ItemService.togglePreview(card)"
on-toggle-sort="ItemService.toggleSortMode()"
on-delete="ItemService.removeParticle(card)"
is-previewing="card === entityInPreview"
is-sorting="ItemService.inSortMode()"
locales='LocaleService.currentLocales'
print-url="getPrintUrl(card)">
</card-item>
Каково ваше предложение?
Спасибо за прочтение.
1 ответ
Решение
Вы должны попытаться вызвать сервисные методы из директивы контроллера,
xApp.directive('xDirective', function(itemService, LocaleService, getPrintUrl) {
function controller() {
angular.extend($scope, {
isSelected: ItemService.isSelected(card),
inSelectMode: "similar to above",
inMoldMode: "similar to above",
onToggleSelect: "similar to above",
onTogglePreview: "similar to above",
onToggleSort: "similar to above",
onDelete: "similar to above",
isPreviewing: "similar to above",
isSorting: "similar to above",
locales: "similar to above",
printUrl: "similar to above"
})
}
return {
controller: controller,
scope: {
card: '=',
item: '='
}
}
});
Вы также можете попытаться разделить эту директиву на более мелкие субдирективы.