AngularJS输入监视$ valid或$ error

时间:2015-04-06 16:54:59

标签: javascript angularjs validation angularjs-scope

我正在尝试$watch控件的$error$valid值。这是控件:

<form id="myForm" name="myForm"> 
  <input name="myInput" ng-model="myInputMdl" business-validation/>
</form>

business-validation是一个自定义指令,可以改变控件的有效性。我根据AngularJS directive watch validity上的内容尝试了以下方法(使用$valid$error):

  1. 由于$valid上不存在myForm.myInput,因此无效。

    $scope.$watch('myForm.myInput.$valid', function (isValid) {
      $scope.usefulVariable = step3.CreditCardNumber.$valid;
    },true);
    
  2. 这不起作用,因为validity.valid显然无法观看。

    $scope.$watch('myForm.myInput.validity.valid', function (isValid) {
      $scope.usefulVariable = step3.CreditCardNumber.$valid;
    },true);
    
  3. 这不起作用,因为每次更改都不会监视$scope.myInputMdl

    $scope.$watch('$scope.myInputMdl', function (isValid) {
      $scope.usefulVariable = step3.CreditCardNumber.$valid;
    },true);
    
  4. 无法从控制器监视有效性吗?

    修改

    我不是要编写或编辑business-validation指令。我正在尝试的是来自表单控件的$watch $valid$error

    编辑2

    控制器的代码是:

    app.controller('WizardBusinessActionCtrl',
       function ($scope, $http, $parse, $filter, wizardBusinessActionService, $timeout) {
         //controller code
       }
    );
    

2 个答案:

答案 0 :(得分:0)

我认为你的第一个变种不应该起作用的原因没有任何理由。

HTML:

<div ng-app="myApp">
    <div data-ng-controller="MainController">
        <form name="myForm"> 
            <input name="myInput" ng-model="myInputMdl" business-validation />
        </form>
    </div>
</div>

控制器和指令:

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

myApp.controller('MainController', function ($scope) {
    $scope.$watch('myForm.myInput.$valid', function (validity) {
        console.log('valid', validity);
    });
});

myApp.directive('businessValidation', function () {
    return {
        restrict: 'A',
        require: 'ngModel',
        link: function (scope, elem, attr, ctrl) {
            function validate (input) {
                return input === 'hello';
            }

            ctrl.$parsers.unshift(function (value) {
                var valid = validate(value);
                ctrl.$setValidity('businessValidation', valid);
                return valid ? value : undefined;
            });

            ctrl.$formatters.unshift(function (value) {
                ctrl.$setValidity('businessValidation', validate(value));
                return value;
            });
        }
    };
});
$valid有效期发生变化时,

myInput属性值会发生变化,并会触发$watch回调。

参见示例:http://jsfiddle.net/Lzgts/287/

答案 1 :(得分:0)

尝试以下代码。 Working Plunker

HTML

<div ng-controller="ExampleController">
  <form name="userForm" novalidate >
    Name:
    <input type="text" name="userName" ng-model="firstName" required />
  </form>
  <div>{{firstName}}</div>
  <input type = 'button'  value = 'Submit' ng-click ='validateInput()'/>
</div>

的JavaScript

 angular.module('getterSetterExample', [])
  .controller('ExampleController', ['$scope', function($scope) {
    $scope.validateInput = function(){
      $scope.$watch($scope.userForm.userName.$valid, function() {
       if($scope.userForm.userName.$valid){
         alert('Value is True');
       }
       else{
         alert('Value is False');
       }
      });

    }

  }]);