Проверка формы. Оптимизировать угловое ng-обязательное выражение

0

Я создаю валидацию формы, и она становится слишком уродливой и тяжелой из-за слишком большого количества полей, которые необходимо проверить. Мне нужно его оптимизировать. Таким образом, я требую любое поле, основанное на других значениях полей, используя 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 :)      
}

Пожалуйста, есть ли кто-то, у кого есть идея, как это сделать? Благодарю.

Теги:
validation

1 ответ

0
Лучший ответ

Я бы предпочел одну переменную области видимости, привязанную ко всему атрибуту 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;
       }
     }
   }
  • 0
    Спасибо, приятель, приятно, что ты на форуме и умное решение, кстати!
  • 1
    Есть ли способ перенести эту функциональность в директиву для поддержания чистоты контроллера? Или этот метод должен оставаться на контроллере? Благодарю.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню