AgnualrJs - $ parsers.unshift与$ parsers.push的区别

时间:2018-05-26 06:22:01

标签: javascript angularjs

自定义指令中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的数组。

2 个答案:

答案 0 :(得分:1)

Unshift和Push功能并非AngularJS独有,而且是一个vanilla Javascript函数。

unshift和push之间的区别在于unshift预先将它附加到数组(在这种情况下将确保函数首先运行),其中push将其添加到数组(允许$ parsers数组中的所有其他内容)在验证之前运行。在这种特殊情况下,最好使用unshift,以便首先进行验证。

注意:$ parsers只是一个常规的javascript数组,它实际上并不是angularJS的独特之处。它继承自array.prototype。

让我们有一个A B C D阵列

例如对于unshift(“X”) 该阵列将输出X A B C D

例如推送(“X”) 该阵列将输出A B C D X

答案 1 :(得分:1)

Parsers documentation parsers来自Array of functions

  

每当控件执行时作为管道执行的函数数组   使用DOM中的新$ viewValue更新ngModelController,   通常通过用户输入。有关详细的生命周期,请参阅$ setViewValue()   说明。请注意,绑定时不会调用$解析器   ngModel表达式以编程方式更改。

     

按函数顺序调用函数,每个函数都传递其返回值   到下一个。最后一个返回值被转发到   $ validators集合。

所以,在你的代码中

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

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

现在,unshiftpush之间存在差异:

  
      
  1. Unshiftshift使整个数组转换sideways(by   从头开始添加和删除项目)
  2.   
  3. Pushpop不会让阵列横向移动(因为它们   最后添加和删除项目)
  4.   

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