Directive的require属性与Angular的表单验证

angular的directive中可以定义新的controller和link函数,也可以通过controller和require属性引用外部的controller和其他directive中的controller以提高重用性

  • require会获取其他指令中的控制器并作为link的第四个参数
    link: function (scope,elem,attr,ctrl){...}
  • 前缀^表示可追溯到父指令,?表示即使找不到也不报错,只是返回null

用法1:引用父指令中的控制器,调用一些公共的属性和方法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title>Document</title>
    <script type="text/javascript" src='./angular.js'></script>
</head>
<body ng-app='myapp'>
    <common>
        <d1></d1>
    </common>
</body>
<script type="text/javascript">
var app = angular.module('myapp',[]);
app.directive('common',function(){
    return {
      controller: function($scope){
        this.method1 = function(){//注意这里要用this
            console.log(123)
        };
      },
    }
});

app.directive('d1',function(){
    return {
      require: '?^common',
      link: function(scope,elem,attrs,common){
          scope.method1 = common.method1;
          scope.method1()//123
      }
    }
});
</script>
</html>

用法2:require:'ngModel'

  • 该指令的标签中必须有ng-model,此时有如下属性和方法:
    • $viewValue为视图值,即显示在视图(页面)的实际值
    • $modelValue为模型值,即赋给ng-model的值(与控制器绑定的值)
      两者不一定相等,因为$viewValue同步到$modelValue要经过一系列的操作(经过三个管道)。虽然大多数情况下两者是相等的。
    • ctrl.$parsers
      一个数组,参数为函数序列,当用户输入该input使ng-model变化时触发,各个函数依次执行,第一个函数的参数为当前ctrl.$viewValue,之后每个函数参数为上一个函数的返回值(每个函数必须有返回值,否则下一个函数不执行),最后一个函数的返回值作为控制器中的model
    • ctrl.$formatters
      一个数组,参数为函数序列,当该model在控制器中的值变化时触发,各个函数依次执行,最后一个函数的返回值作为ctrl.$viewValue返回给对应input
      以上为$viewValue和$modelValue之间同步的管道,使用之后可以使ng-model的view和model两者值不等
      不管是$parsers还是$formatters,都只是ng-model和model之间的交互,例如ng-model='hello',传给model中的hello时,数值因$parsers发生变化,然后model中的hello再传给{{hello}},即是变化后的数值,因此input中的值($viewValue)与{{hello}}不等
    • ctrl.$setValidity(key,Boolean)
      设置一个验证的值,可以直接通过ctrl.$error.key和ctrl.$valid查看,也可以{{myform.myinput.$valid}}和{{myform.myinput.$error.key}}查看
      只要$error非空,$valid即为false
<!DOCTYPE html>
<html lang="en" ng-app='myapp'>
<head>
    <meta charset="UTF-8" />
    <title>Document</title>
    <script type="text/javascript" src='./angular.js'></script>
</head>
<body ng-controller='con'>
    <input type="text" name="" ng-model="myModel">
    <input common ng-model='myModel'>
</body>
<script type="text/javascript">
var app = angular.module('myapp',[]);
app.controller('con',function($scope,$timeout){
    $scope.myModel=222;
    $timeout(function(){
        console.log($scope.myModel)
    },2000)
})
app.directive('common',function(){
    return {
        require:'ngModel',
        scope:{
            ngModel:'='//此处等价于scope:false
        },
        link:function(scope,elem,attr,ctrl){
            console.log(ctrl)
            var fn1= function(a){
                console.log(1)
                return a
            }
            function fn2(a){
                console.log(2)
                console.log(a)
                return 2
            }
            ctrl.$parsers.push(fn2)
            ctrl.$formatters.push(fn1)
        }
    }
});
</script>
</html>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容