我想创建自己的Angular指令并对其使用表单验证。这将允许我在其他地方重用此部分表单。实际的代码是不同的,但我觉得我在这里错误地思考。首先我做了一个表格:
<form name="check1">
<input name="first" ng-model="first" type="text" required>
<input name="second" ng-model="second" type="text" required>
<input name="third" ng-model="third" type="text" required>
</form>
<span ng-show="check1.$invalid">Form is invalid</span>
验证工作正常。然后我希望我的表格类似于:
<form name="check2">
<input name="first" ng-model="first" type="text" required>
<mydirective second="second" third="third" required></mydirective>
</form>
<span ng-show="check2.$invalid">Form is invalid</span>
和JS:
app.directive('mydirective', function() {
return {
restrict: 'E',
transclude: true,
template:
'<span>'+
'<input name="second" ng-model="second" type="text" >'+
'<input name="third" ng-model="third" type="text" >'+
'</span>'
,
replace: true,
scope: {
second: '=',
third: '='
}
}
});
如何使验证工作?现在填写“first”将使check2格式有效。
我尝试将链接功能添加到控制器:
link: function(scope, element, attrs, controller) {
controller.$parsers.unshift(function(viewValue)
console.log(viewValue);
return viewValue;
});
}
但我得到了:
TypeError: Cannot call method 'unshift' of undefined
任何想法我做错了什么?
修改
似乎我的问题写得不好。我正在寻找Angular指令中有条件“必需”字段的可能性。所以制作:
<mydirective second="second" third="third" required></mydirective>
将需要指令字段,而不会:
<mydirective second="second" third="third"></mydirective>
解决方案是在链接功能和ng-required中使用attrs。所以:
app.directive('mydirective', function() {
return {
template:
'<span>'+
'<input name="second" ng-model="second" type="text" ng-required="is_required">'+
'<input name="third" ng-model="third" type="text" ng-required="is_required">'+
'</span>'
,
link: function(scope, iElement, iAttrs) {
scope.is_required = angular.isDefined(iAttrs.required)
}
}
});
答案 0 :(得分:0)
只需将“required”作为属性添加到指令模板代码中 (似乎你忘了这样做,因为在你的第一个代码片段中,每个INPUT都有一个“必需”) 一切都会好的。