我有一个a
Angular元素指令,它的操作与Stack Overflow自己的'tags'输入字段的操作非常相似。
我想验证tags
元素上的ng-model
属性是一个至少包含一个标记且少于十个标记的数组。但是,我不想创建一个单独的指令来验证这一点,因为我永远不需要再次验证数组的长度。我希望逻辑在element指令中自包含。
这是我到目前为止所得到的:
tag
我的指令就像这样使用:
angular.module("directives.tags", []).directive("tags", ["Tag", "$timeout", function(Tag, $timeout) {
return {
require: 'ngModel',
restrict: 'E',
scope: {
availableTags: '=',
selectedTags: '=ngModel',
placeholder: '@'
},
link: function($scope, element, attributes, ctrl) {
// Snip
ctrl.$validators.taglength = function(mv, vv) {
return (mv.length > 0);
}
}
}
但是,我的<tags available-tags="data.tags" name="tags" ng-model="text.tags"></tags>
<span ng-show="writeForm.tags.$error.taglength">Invalid!</span>
验证器无效,或者我没有正确绑定它。有什么想法吗?
答案 0 :(得分:0)
在模板中,您需要引用元素name
,而不是控制器scope
中的变量。而且,在您指令的独立范围内,您可以使用普通ngModel
。
例如:
<body ng-controller="Ctrl">
Tags: {{ usedTags | json }}
<ng-form name="writeForm">
<tags name="tags"
ng-model="usedTags"
available-tags="availableTags">
</tags>
<span class="valid"
ng-show="writeForm.tags.$valid">
Valid!
</span>
<span class="invalid"
ng-show="writeForm.tags.$error.taglength">
Invalid!
</span>
</ng-form>
<button type="button"
ng-click="changeModel()">
Change
</button>
</body>
angular.module("directives.tags", [])
.controller('Ctrl', function($scope) {
$scope.usedTags = [];
$scope.availableTags = ['a','b'];
$scope.changeModel = function() {
$scope.usedTags = $scope.usedTags.length === 0 ? ['a'] : [];
};
})
.directive("tags", function() {
return {
require: 'ngModel',
restrict: 'E',
scope: {
ngModel: '=',
availableTags: '='
},
link: function(scope, element, attributes, ctrl) {
ctrl.$validators.taglength = function() {
return scope.ngModel.length > 0;
};
}
};
});
此处相关的plunker http://plnkr.co/edit/SiC8wk