#javascript #html #angularjs #validation #directive
#javascript #HTML #angularjs #проверка #директива
Вопрос:
Я пытаюсь создать элемент директивы ввода с проверкой. Я хотел бы управлять состоянием ошибки в этой директиве.
Есть 3 файла
- Index.html : использует эту директиву
- textValid.js : содержит код директивы
- textValid.html : содержит шаблон директивы
Я создаю эту директиву
textValid.js
App.directive("textValid", function() {
return {
restrict: "E",
templateUrl: "tpl/textValid.html",
require: "?ngModel",
scope: {
name: "@",
element: "=",
model: "="
}
};
});
index.html
<form name="edit_form_ctrl.contract_edit_form" action="#" novalidate >
<div class="row">
<text-valid name="ncontract"model="edit_form_ctrl.contract.ncontract"
element="edit_form_ctrl.contract_edit_form.ncontract">
</text-valid>
</div>
</form>
и шаблон textValid.html
<input type="text" name="name" ng-model="model" class="form-control" ng-required="true" value="{{model}}" />
<div>pristine: {{element.$pristine}}</div> <!--is always undefined-->
<div>Invalid: {{element.$error}}</div> <!--is always undefined-->
<span class="color-red" ng-if="element.$error.required amp;amp;!element.$pristine">
{{curLang.field_mandatory}}
</span>
Я пытаюсь заставить элемент управления вводом проверять $ error и $ нетронутое значение, но я не могу этого добиться.
Я прочитал всю документацию и книгу тоже, но без каких-либо результатов.
Кто-нибудь пытается это сделать?
Заранее спасибо
Ответ №1:
Если вы добавите {{двойные завитушки}} вокруг атрибута name элемента ввода следующим образом:
<input type="text" name="{{name}}" ng-model="model" class="form-control" ng-required="true" />
Вы должны иметь возможность получить доступ к ngModelController
для него изнутри text-valid
с помощью $scope.form[$scope.name]
Пара других замечаний:
-
использование
value
атрибута on и элемента сng-model
атрибутом не будет иметь эффекта. -
у вас есть
require: '?ngModel'
в вашей директиве определение, но нетng-model
атрибута дляtext-valid
элемента. Это нормально, но вы не получите никакихngModelController
вводимых данных, если уtext-valid
элемента нетng-model
атрибута.
Редактировать:
Поскольку text-valid
имеет область изоляции, для доступа к FormController
вам нужно будет запросить ее и привязать:
App.directive("textValid", function() {
return {
restrict: "E",
templateUrl: "tpl/textValid.html",
require: "^^form",
scope: {
name: "@",
element: "=",
model: "="
},
link: function($scope, elem, attr, FormCtrl){
$scope.form = FormCtrl;
// now you should be able to access $scope.form[$scope.name]
// (you *might* need to put any initialization that accesses it inside a $timeout to wait for it to be rendered/bound)
}
};
});
Затем в шаблоне вы должны иметь доступ к нему следующим образом:
<div>pristine: {{form[name].$pristine}}</div>
<div>Invalid: {{form[name].$error}}</div>
Комментарии:
1. Вы имеете в виду функцию ссылки внутри директивы? Я попытался добавить в textValid.js ссылка: функция ($scope, элемент, attr, ctrl), но $scope.form[name] возвращает ошибку, потому что form имеет значение null.
2. ах да, допустимый текст имеет область изоляции. Я отредактировал свой ответ с учетом этого.
3. Спасибо, чувак! Это работает…. Просто вопрос: что означают эти два ‘^^’ перед формой?!
4. Рад, что это работает!
^^
в require означает требовать от предка элемента DOM.^
в require означает требовать от элемента DOM ИЛИ предка. Ознакомьтесь с Исчерпывающими документами Directive API в разделе require » Объект определения директивы »5. Спасибо вам за все.
Ответ №2:
Попробуйте это:
<input type="text" name="name" ng-model="model" class="form-control" ng-required="true" value="{{model}}" />
<div>pristine: {{form.name.$pristine}}</div> <!--is always undefined-->
<div>Invalid: {{form.name.$error}}</div> <!--is always undefined-->
<span class="color-red" ng-if="element.$error.required amp;amp;!element.$pristine">
{{curLang.field_mandatory}}
</span>
Комментарии:
1. технически это сработало бы, но на самом деле не позволило бы повторно использовать
text-valid
директиву в форме, поскольку было бы несколько именованных входных данных'name'
2. Вы правы… Я был неправ. {{name}} — правильное значение. Таким образом, он может быть динамическим