2015-07-01 4 views
0

Я создаю проверку формы, и она становится слишком уродливой и тяжелой из-за слишком большого количества полей, которые необходимо проверить. Мне нужно его оптимизировать. Таким образом, я требую любое поле, основанное на других значениях полей, используя ng-required. Когда пользователь вставляет значение в одно из полей, остальные из них теряют требуемое качество и форма становится действительной. Так, что я создал выражение вроде этого:Проверка формы. Оптимизировать Угловое ng-необходимое выражение

<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 :)  
} 

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

ответ

0

Я бы предпочел одну переменную области, которая привязана ко всем атрибутам ng-обязательного поля ввода. И при изменении любого из входных полей переключите эту переменную. человек

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

Thank, в хорошо у вас на форуме и умное решение КСТАТИ! – Webdesigner

+1

Есть ли способ переместить эту функциональность в директиве, чтобы поддерживать очистку контроллера? Или такие типы mehtods должны оставаться на контроллере? Благодарю. – Webdesigner

+1

Да, это было бы возможно, и это была моя первоначальная мысль. (Я думал, что лучше избегать изменения ng на каждом входе). Проверьте этот плункер для моей требуемой директивы. http://plnkr.co/edit/khnLGtarAlcQiLzBZiOP?p=preview. Пока новая директива не создает новую область видимости, одна и та же переменная может использоваться совместно. – Bharat

Смежные вопросы