自定义指令中ngModelCtrl.$parsers.unshift
和ngModelCtrl.$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
的数组。
答案 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
现在,unshift
和push
之间存在差异:
Unshift
和shift
使整个数组转换sideways
(by 从头开始添加和删除项目)- 醇>
Push
和pop
不会让阵列横向移动(因为它们 最后添加和删除项目)
因此,ngModelCtrl.$parsers.unshift
insert
您的first index
和ngModelCtrl.$parsers.push
函数将insert
您的函数转移到last index