在angularjs中验证密码指令

时间:2015-01-07 18:21:45

标签: javascript angularjs

任何人都可以向我解释这段代码是如何工作的。

HTML标记

<input type="password" ng-model="password" class="form-control" placeholder="Password" required>
<input type="password" ng-model="confirm_password" class="form-control" placeholder="Password" required validate-equals="password">

指令代码

angular.module('app')
  .directive('validate', function () {
    return {
      require: "ngModel",   
      link: function postLink(scope, element, attrs, ngModelCtrl) {
        function validate(value){
            var valid = (value === scope.$eval(attrs.validate));
            ngModelCtrl.$setValidtity('equal', valid);
            return valid ? value : undefined;
        }

        ngModelCtrl.$parsers.push(validate);
        ngModelCtrl.$formatters.push(validate);

        $scope.$watch(attrs.validate, function(){
            ngModelCtrl.$setViewValue(ngModelCtrl.$viewvalue);
        })
      }
    };
  });

任何人都可以在下面解释questions

以下代码在directive中做了什么?。

$scope.watch(attrs.validate, function(){
    ngModelCtrl.$setViewValue(ngModelCtrl.$viewvalue);
});

value如何传递给validate()功能?

1 个答案:

答案 0 :(得分:1)

查看ngModelController的文档。由于该指令需要ngModel,因此它接收ngModelController作为链接函数的第四个参数。关于您的其他问题:

  1. $scope.watch(应该是$scope.$watch)调用在指令运行的元素的validate属性上设置watch。如果validate属性由于某种原因而改变(例如,它绑定到值改变的AngularJS表达式),则将执行作为第二个参数传递的函数。此函数重置视图值,该值重新触发注册为解析器的validate函数。
  2. 根据ngModelController文档,视图值将传递给第一个解析器函数,该函数的结果将传递给下一个解析器,依此类推。同样,模型值将传递给第一个格式化程序函数,结果将传递给下一个格式化程序。