У меня есть 10 директив, использующих области выделения. Все они привязываются к параметру с именем size
. Поэтому я планирую создать общую директиву suiCommon
и включить эту директиву во все 10 директив. Так что мне не нужно повторять scope: { size: '@' }
для всех 10 директив.Обновить директивное представление при изменении значения атрибута
В моем текущем решении JSFiddle этот параметр правильно передан в директиве. Однако, когда значение изменяется вне, значение в директиве не изменяется и не применяется.
Моя общая директива:
angular.module('sui.common', [])
.directive('suiCommon', ['$timeout', function ($timeout) {
return {
restrict: 'A',
link: function (scope, iElement) {
var $parentElement = iElement.parent();
$timeout(function() {
scope.vm.size = $parentElement.attr('size');
});
}
}
}]);
Один из моих 10 директив, как:
angular.module('sui.rating', ['sui.common'])
.directive('suiRating', [function() {
return {
restrict: 'A',
scope: {},
template:
'<div sui-common class="ui {{vm.size}} rating sui-rating">Content</div>',
controllerAs: 'vm',
bindToController: true,
controller: ['$scope', function ($scope) {}]
};
}]);
Вот HTML:
<div ng-app="Joy" ng-controller="JoyCtrl as vm">
<div ng-click="vm.setSize()">Click to change size</div>
<div sui-rating size="{{vm.size}}"></div>
</div>
Теперь, когда size
изменяется на small
через ng-click
, значение внутри директивы не является ча nged. В моем понимании, ng-click
вызовет $scope.$apply
, который будет переопределять директиву suiCommon
. Кажется, я ошибаюсь ...
Может кто-нибудь объяснить причину? Как это исправить? Или есть лучшее решение?
Просто мнение, но я считаю, что наличие «scope: {size: '@'}» в каждой директиве было бы более понятным и содержательным, чем создание директивы, которая вводит параметр в некоторые другие директивы. Было бы труднее понять, что происходит с вашими директивами. – Okazari
@ Оказар благодарит вас за ваши предложения. Я думаю, есть лучший способ достичь этого. И будет ждать еще нескольких мнений. – Joy