Я хочу создать пользовательскую директиву, которая отображается как элемент типа ввода. Директива должна повторно использовать структуру проверки angularjs. Ниже приведена директива custom-input
в действии, которую я создал:
<!doctype html>
<html ng-app="validationApp">
<body>
<div class="container" ng-controller="ValidationController as validationController">
<form name="myForm">
{{employee | json}}
<custom-input ng-required="true" ng-model="employee.name" name="employee.name" id="employeeName" ng-pattern="/^[0-9]{1,7}$/"/></custom-input>
<span ng-show="myForm['employee.name'].$error.required">This is a required field</span>
<span ng-show="myForm['employee.name'].$error.pattern">This is a invalid field</span>
</form>
</div>
<script type="text/ng-template" id="/templates/customInput.html">
<div>
<input type="text" name="{{name}}" ng-model="newInput" id="{{id}}">
</div>
</script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.6/angular.js"></script>
</body>
</html>
Соответствующий этому javascript:
angular.module('validationApp', [])
.controller("ValidationController", function(){
})
.directive("customInput", function(){
return {
restrict: "E",
require : "ngModel",
replace: "true",
templateUrl : "/templates/customInput.html",
scope : {
id : "@", //bind id to scope
name : "@" //bind name to scope
},
link: function(scope, element, attrs, ngModelCtrl){
//When newInput is updated, update the model of original input
scope.$watch('newInput', function(newValue){
ngModelCtrl.$setViewValue(newValue);
});
//On first load, get the initial value of original input's model and assign it to new input's model
ngModelCtrl.$render = function(){
var viewValue = ngModelCtrl.$viewValue;
if(viewValue){
scope.newInput = viewValue;
}
}
}
}
});
Я пытаюсь применить проверку ng-required
и ng-pattern
к этому пользовательскому вводу. Я сталкиваюсь с двумя проблемами:
- В angularjs 1.2.6 я могу запустить проверку
ng-required
вcustom-input
, но в 1.3.0 проверка не запускается. - Я не могу запустить проверку
ng-pattern
в обеих версиях.
Насколько я понимаю, $setViewValue
из ngModelController
будут запускать все проверки. Вышеупомянутый пример — надуманный пример, мой фактический вариант использования — создать пользовательскую директиву, которая отображает три поля ввода для SSN.
Ниже приведена ссылка на плункер для 1.2.6 и 1.3.0 соответственно: