自定义指令中ngModelCtrl.$parsers.unshiftngModelCtrl.$parsers.push的确切区别是什么?

我想迫使angular验证发生在model而不是form本身上的某些事情的形式。我尝试设置Form.$setSubmitted,但我知道这不是应该做的方法。经过几次谷歌搜索后,我发现在自定义验证指令中必须使用类似ngModelCtrl.$parsers.unshift的名称。

我的指令有责任检查绑定到ng-model的数组的长度:

return {
        restrict: 'A',
        require: 'ngModel',
        link: function ($scope, elem, attrs, ngModelCtrl) {

            ngModelCtrl.$parsers.push(function (viewValue) {
                // doesn't enter this function at all!
                console.log(viewValue);
            });

            ngModelCtrl.$validators.requiredCount = function (modelValue, viewValue) {
                // executed at the first time only at initialize
                return modelValue.length == attrs.requiredCount;
            };
        }
    };


以及我如何使用它:

<list orientation="vertical" type="PropertyValue" ng-model="Entity.PropertyValues"
          dont-save
          ng-required="PropertyTypeIdObject.Code === 'FixedValues'"
          required-count="1"></list>


list本身是负责处理绑定到ng-model的数组的指令。

最佳答案

Parsers documentation parsersArray of functions


  每当控件时要作为管道执行的函数数组
  使用DOM中的新$ viewValue更新ngModelController,
  通常通过用户输入。有关详细的生命周期,请参见$ setViewValue()
  说明。注意,绑定时不调用$ parsers
  ngModel表达式以编程方式更改。
  
  这些函数按数组顺序调用,每个传递其返回值
  到下一个。最后的返回值转发到
  $ validators集合。


所以,在你的代码中

 ngModelCtrl.$parsers.push(function (viewValue) {
      // doesn't enter this function at all!
      console.log(viewValue);
 });


您正在将新的function推送到parsers数组以验证ngModel controller

现在,unshiftpush之间的区别:


  
  Unshiftshift使整个数组移位sideways(通过
  从一开始添加和删除项)
  Pushpop不会使阵列侧移(因为它们
  最后添加和删除项)
  


因此,ngModelCtrl.$parsers.unshift insert您对first indexngModelCtrl.$parsers.push的函数将insert您对last index的函数

07-28 11:08