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

时间:2014-09-12 03:25:38

标签: javascript angularjs validation

我正在使用AngularJs 1.2。我遇到了$ setValidity的问题。

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

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

现在我需要在某些指定输入上使用$ setValidity,但是我失败了

scope["finish_form"]["pagename[0]"].$setValidity('not-duplicated', false);

我试着记录:

console.log(scope["finish_form"]["pagename[0]"]) => return undefined
console.log(scope["finish_form"]["pagename[{{key}}]"]) => return last input

我在浏览器上检查了元素,pagename [0]已经存在。

我需要帮助,PLZ。

谢谢大家。

更新

.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;
                    });
                }
            };
        }]);

1 个答案:

答案 0 :(得分:1)

这是因为在ngModelController的实例化期间检索了控件的名称(在其父表单上注册的名称), according to the docs 发生在预连接阶段*之前(所以还没有插值)。

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


请查看 this answer 以获取更详细的说明和可能的解决方案(使用额外指令)。