我有大约10个指令使用隔离范围。它们都绑定到名为size
的参数。所以我打算创建一个通用指令suiCommon
并在所有10个指令中包含此指令。所以我不需要为所有10个指令重复scope: { size: '@' }
。当属性值改变时更新指令视图
在我当前的解决方案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
,指令内的值不是cha nged。根据我的理解,ng-click
将触发$scope.$apply
,这将重新呈现指令suiCommon
。似乎我错了...
有人请解释原因吗?如何解决它?还是有更好的解决方案?
只是一个意见,但我觉得在每个指令中有“范围:{size:'@'}”比创建一个将参数注入其他指令的指令更清晰和可维护。这将是很难理解你的指令发生了什么 – Okazari
@Okazari感谢您的建议。我想有一些更好的方法来实现这一点。并将等待更多的意见。 – Joy