我尝试创建一个指令,该指令应检查是否选中了复选框项列表中的至少一个项目。如果不是,它应该在列表下显示错误消息。因此我创建了这个指令:
.directive('validateServices', [function () {
function validate(services) {
for(var x= 0;x<services.length;x++) {
if(services[x].selected) return false;
}
return true;
}
return {
restrict: 'A',
require: 'ngModel',
link: function (scope, ele, attrs, ngModel) {
ngModel.$validators.emptyServices = function (modelValue) {
return validate(modelValue);
}
}
}
}]);
用法:
<ul class="list" validate-services ng-model="pricelist">
<li class="item title-left"><b>Prestaties</b></li>
<li ng-repeat="price in pricelist" class="item item-checkbox" ng-click="calculateSum()">
<label class="checkbox">
<input type="checkbox" ng-model="price.selected">
</label>
{{price.name}}
</li>
</ul>
<div role="alert">
<span class="error" ng-if="submitted && pricelist.$error.emptyServices">
Vul een prestatie
</span>
</div>
但即使值正确,警报也不会显示出来。这条指令有什么问题?
答案 0 :(得分:1)
ngModelController
要使用ngModelController
进行验证,您需要拥有表单元素或ng-form
指令(docs)。要创建条件错误消息,您需要访问ngModel的$error
对象,这样您就可以知道它何时有效/无效。
<div ng-form="priceForm">
...
<ul class="list" validate-services name="plField" ng-model="pricelist">
...
这是条件的样子:
<span class="error" ng-if="priceForm.plField.$error.emptyServices">
<强>指令强>
在指令链接功能中,您需要在$watch
值上设置手册ngModel
,并在ngModel更改时调用验证函数:
scope.$watch('ngModel', function(newValue, oldValue) {
// this sets your ngModel's validity based on your
// validation function
ngModel.$setValidity('emptyServices', validate(newValue));
}, true);
您可以在此plnkr中看到一个有效的示例:http://plnkr.co/edit/B1MPNBR5EC7YARKdvTO2?p=preview