Я создаю валидацию формы, и она становится слишком уродливой и тяжелой из-за слишком большого количества полей, которые необходимо проверить. Мне нужно его оптимизировать. Таким образом, я требую любое поле, основанное на других значениях полей, используя ng-required. Когда пользователь вставляет значение в одно из полей, остальные из них теряют требуемое качество и форма становится действительной. Итак, для этого я создал такое выражение:
<input ng-model="field.one" ng-required="
!field.two &&
!field.three &&
!field.four &&
!field.five &&
!field.six &&
... &&
!filed.twenty"/>
<input ng-model="field.two" ng-required="
!field.one &&
!field.three &&
!field.four &&
!field.five &&
!field.six &&
... &&
!filed.twenty"/>
Таким образом, я намерен переместить требуемое выражение в контроллере или где вы думаете, что его нужно переместить, чтобы оптимизировать и упорядочить код. Я собирался инкапсулировать его в функцию внутри контроллера, но мне это не удалось. Я попробовал что-то вроде этого:
VIEW
<input ng-model="field.one" ng-required="myFunc(field.one)"/>
CTRL
$scope.myFunc = function(modelField){
anything I tried in this fn I didn't make it to work syncronized with
the field models, updating their models based on user interaction :)
}
Пожалуйста, есть ли кто-то, у кого есть идея, как это сделать? Благодарю.
Я бы предпочел одну переменную области видимости, привязанную ко всему атрибуту ng-required поля ввода. И при изменении любого из входных полей переключите эту переменную.
http://plnkr.co/edit/PVXVD9RKM8cMwCVjFA7c?p=preview
<input type="text" ng-change="onChange(userName1, 'name1')" name="name1" ng-model="userName1" ng-required="required">
<input type="text" ng-change="onChange(userName2, 'name2')" name="name2" ng-model="userName2" ng-required="required">
$scope.required = true;
$scope.userNames = [];
$scope.onChange = function(val, name) {
if (val) {
if ($scope.userNames.indexOf(name) == -1) {
$scope.userNames.push(name);
}
$scope.required = false;
} else {
if ($scope.userNames.indexOf(name) !== -1) {
$scope.userNames.splice($scope.userNames.indexOf(name), 1);
}
if ($scope.userNames.length === 0) {
$scope.required = true;
}
}
}