2015-10-28 5 views
0

Какие изменения необходимо внести, чтобы получить стандартную директиву countparens ниже, чтобы предоставить дополнительную пользовательскую проверку строки, показанную ниже во время проверки формы? Код ниже ПРЕДУПРЕЖДЕНА предупреждает пользователя, когда поле ввода пуст, но оно НЕ предупреждает пользователя, когда количество открытых парсеров ( и close parens ) не равно.изготовленный под заказ не принимается. почему нет?

Я использую AngularJS. Я использовал the documentation at this link (scroll to bottom) для разработки кода ниже.

Вот HTML для формы:

<table> 
    <tr> 
     <td width=200> 
      <form name="userForm" ng-submit="rectangularForm(userForm.$valid)" novalidate> 
       <input type="text" name="fieldname" ng-model="nameofjsontype.fieldname" required /> 
       <p ng-show="userForm.fieldname.$invalid && !userForm.fieldname.$pristine" class="help-block">Function is a required field.</p> 
       <span ng-show="userForm.nameofjsontype.fieldname.$error.countparens">The #(!= #) !</span> 
       <br> 
       <button type="submit" ng-disabled="userForm.$invalid" >Click to submit</button> 
      </form> 
     </td> 
    </tr> 
</table> 

Javascript файл, содержащий директиву включает:

// create angular app 
var myApp = angular.module('myApp', []); 

// create angular controller 
myApp.controller('myController', ['$scope', '$http', function($scope, $http) { 
$scope.nameofjsontype = {type:"nameofjsontype", fieldname: 'some (value) here.'}; 

    $scope.rectangularForm = function(isValid) { 
     // check to make sure the form is completely valid 
     if (isValid) { 
      var funcJSON = {type:"nameofjsontype", fieldname: $scope.nameofjsontype.fieldname}; 
      $http.post('/server/side/controller', funcJSON).then(function(response) { 
      $scope.nameofjsontype = response.data; 
      }); 
     } 
    }; 
}]); 

myApp.directive('countparens', function() { 
return { 
    require: 'ngModel', 
    link: function(scope, elm, attrs, ctrl) { 
    ctrl.$validators.countparens = function(modelValue, viewValue) { 
     if (ctrl.$isEmpty(modelValue)) { 
     // consider empty models to be valid 
     return true; 
     } 

     if (
     ($scope.nameofjsontype.fieldname.match(/\)/g).length) == ($scope.nameofjsontype.fieldname.match(/\(/g).length) 
     ) { 
     // it is valid 
     return true; 
     } 

     // it is invalid 
     return false; 
    }; 
    } 
}; 
}); 
+0

Можете ли вы предоставить плункер с кодом? – lebobbi

+0

@lebobbi Я изучаю это, но я никогда не использовал его раньше. – CodeMed

ответ

2

Ваша разметка должна использовать userForm.fieldname.$error.countparens показать ошибку. Поле, связанное с userForm, не совпадает с вашим значением ngModel. См plunker за то, что я имею в виду

<span ng-show="userForm.fieldname.$error.countparens" class="help-block">The #(!= #) !</span> 

Вы также не используется директива от входного элемента:

<input type="text" name="fieldname" ng-model="nameofjsontype.fieldname" required data-countparens=""/> 

В вашей директиве

  • вы должны использовать modelValue и не масштаб значение при выполнении вашего соответствия И
  • вам необходимо обслужить, если нет совпадений с ( или )

.

myApp.directive('countparens', function() { 
    return { 
     require: 'ngModel', 
     link: function(scope, elm, attrs, ctrl) { 
      ctrl.$validators.countparens = function(modelValue, viewValue) { 
      return ctrl.$isEmpty(modelValue) || 
       ((modelValue.match(/\)/g) || []).length == (modelValue.match(/\(/g) || []).length); 
      }; 
     } 
    }; 
}); 
+0

Благодарим вас и +1 за быстрый и правильный ответ. – CodeMed

+0

На самом деле, когда я проверяю ваш код, вы сделали так, чтобы предупреждение о пустом поле также срабатывало всякий раз, когда существует неравное число круглых скобок. Таким образом, есть два сообщения, когда количество открытых и закрытых парнеров неравномерно (что неверно) и только одно сообщение, когда поле пусто (что правильно). Как настроить код выше, чтобы устранить эту проблему? – CodeMed

+0

@CodeMed В этом случае вы должны проверить поле 'required' validation' userForm.fieldname. $ Error.required' вместо того, чтобы просто проверять, является ли оно недопустимым с 'userForm.fieldname. $ Invalid' в вашем' ng-show' , См. Обновленный [plunker] (http://plnkr.co/edit/Cn4x5N5p5wmPCvKhFZgU?p=preview) – user2718281

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