Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJs:在数组输入上使用$setValidity_Javascript_Angularjs_Validation - Fatal编程技术网

Javascript AngularJs:在数组输入上使用$setValidity

Javascript AngularJs:在数组输入上使用$setValidity,javascript,angularjs,validation,Javascript,Angularjs,Validation,我正在使用AngularJs 1.2。我对$SETVALITY有问题 我有一个带有ng repeat的表单输入: <div ng-repeat="(key, value) in addition_page"> <input ng-model="addition_page[key].name" name="pagename[{{key}}]" not-duplicated="1"> </div> 我试图记录: console.log(scope["f

我正在使用AngularJs 1.2。我对$SETVALITY有问题

我有一个带有ng repeat的表单输入:

<div ng-repeat="(key, value) in addition_page">
    <input ng-model="addition_page[key].name" name="pagename[{{key}}]" not-duplicated="1"> 
</div>
我试图记录:

console.log(scope["finish_form"]["pagename[0]"]) => return undefined
console.log(scope["finish_form"]["pagename[{{key}}]"]) => return last input
我检查了浏览器上的元素,页面名[0]存在

我需要帮助

谢谢大家

更新:

.directive('notDuplicated', [function() {
            return {
                require: 'ngModel',
                link: function(scope, elem, attr, ngModel) {
                    var val_id = attr.notDuplicated;

                    var setValidity = function(value) {
                        if (value === "") return true;
                        var same_now = [];
                        var same_past = [];
                        angular.element("[not-duplicated=" + val_id + "]").each(function(k, v) {
                            if (angular.element(v).val() === value) {
                                same_now.push(k);
                            }
                            if (ngModel.$modelValue !== "" && angular.element(v).val() === ngModel.$modelValue) {
                                same_past.push(k);
                            }
                        })

                        // mark old input is valid
                        if (same_past.length === 1) {
                            scope["finish_form"]["pagename[" + same_past[0] + "]"].$setValidity('not-duplicated', true);
                        }

                        // mark new inputs is invalid
                        if (same_now.length > 1) {
                            same_now.each(function(k) {
                                scope["finish_form"]["pagename[" + k + "]"].$setValidity('not-duplicated', false);
                            });
                            return false;
                        }
                        return true;

                    }

                    //For DOM -> model validation
                    ngModel.$parsers.unshift(function(value) {
                        var valid = setValidity(value);
                        return valid ? value : undefined;
                    });

                    //For model -> DOM validation
                    ngModel.$formatters.unshift(function(value) {
                        setValidity(value);
                        return value;
                    });
                }
            };
        }]);

发生这种情况是因为在
ngModelController
的实例化过程中检索控件的名称(它在其父窗体上注册的名称),发生在预链接阶段*(因此还没有插值)

如果检查
myForm
的属性,就会发现所有输入都注册为“pagename[{{key}}]”



查看以获得更详细的解释和可能的解决方案(使用额外的指令)。

您在哪里执行此操作:“范围[“完成表单”][“页面名[0]”]。$setValidity('not-duplicated',false);“?您是否在自定义验证指令的链接函数中执行此操作?是否在自定义验证指令的链接函数中执行此操作?=>是的。在ngModel内部。$parsers.unshift和ngModel。$formatters.unshiftmmm,你能分享剩下的代码吗?我附加了我的指令。看看这个。谢谢。对于ngModelController,名称插值
{{}
不起作用。请看ng form指令。@LêTrầnTiếnTrung:很高兴知道:)也可以随意选择另一个答案,让其他人知道它对你的问题有帮助。
.directive('notDuplicated', [function() {
            return {
                require: 'ngModel',
                link: function(scope, elem, attr, ngModel) {
                    var val_id = attr.notDuplicated;

                    var setValidity = function(value) {
                        if (value === "") return true;
                        var same_now = [];
                        var same_past = [];
                        angular.element("[not-duplicated=" + val_id + "]").each(function(k, v) {
                            if (angular.element(v).val() === value) {
                                same_now.push(k);
                            }
                            if (ngModel.$modelValue !== "" && angular.element(v).val() === ngModel.$modelValue) {
                                same_past.push(k);
                            }
                        })

                        // mark old input is valid
                        if (same_past.length === 1) {
                            scope["finish_form"]["pagename[" + same_past[0] + "]"].$setValidity('not-duplicated', true);
                        }

                        // mark new inputs is invalid
                        if (same_now.length > 1) {
                            same_now.each(function(k) {
                                scope["finish_form"]["pagename[" + k + "]"].$setValidity('not-duplicated', false);
                            });
                            return false;
                        }
                        return true;

                    }

                    //For DOM -> model validation
                    ngModel.$parsers.unshift(function(value) {
                        var valid = setValidity(value);
                        return valid ? value : undefined;
                    });

                    //For model -> DOM validation
                    ngModel.$formatters.unshift(function(value) {
                        setValidity(value);
                        return value;
                    });
                }
            };
        }]);