Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.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
Angularjs 角度自定义表单验证$错误不起作用_Angularjs_Angularjs Directive - Fatal编程技术网

Angularjs 角度自定义表单验证$错误不起作用

Angularjs 角度自定义表单验证$错误不起作用,angularjs,angularjs-directive,Angularjs,Angularjs Directive,这是那些让你把头发扯下来的虫子之一 我已经编写了一个指令,根据选择框中选择的值对时间、距离或总点数执行自定义验证。在这里,它工作得很好: 当我将指令应用于我的应用程序时,问题就开始了。表单的$invalid属性设置为true,但是$error.mymeasure虽然在调试器中显然设置为true,但对视图没有任何影响 Chrome调试器输出屏幕截图: 用于输出$error和$invalid属性的代码: entriesForm.savedcurvalue.$error.mymeasure: {{

这是那些让你把头发扯下来的虫子之一

我已经编写了一个指令,根据选择框中选择的值对时间、距离或总点数执行自定义验证。在这里,它工作得很好:

当我将指令应用于我的应用程序时,问题就开始了。表单的$invalid属性设置为true,但是$error.mymeasure虽然在调试器中显然设置为true,但对视图没有任何影响

Chrome调试器输出屏幕截图:

用于输出$error和$invalid属性的代码:

entriesForm.savedcurvalue.$error.mymeasure: {{ entriesForm.savedcurvalue.$error.mymeasure }} 
  / $invalid: {{ entriesForm.$invalid }} <br/>
以及该指令:

app.directive('smartMeasurement', function () {
    return {
        require: 'ngModel',
        scope: {
            ngModel: '=',
            smartMeasurement: '=',
            errorformat: '=',
            decimal: '='
        },
        link: function (scope, elm, attrs, ctrl) {
            var REGEX;
            var TIME_REGEXP;
            var LENGTH_REGEXP;
            var MULTI_REGEXP = /^(?:\d{1,5})?$/;

            if (scope.decimal == ",") {
                TIME_REGEXP = /^(?:\d+:)?(?:[0-5]\d:|[0-9]:)?(?:[0-5]\d|\d|^\d\d\d)(?:[.,]\d\d?)?$/;
                LENGTH_REGEXP = /^(?:\d{1,3})(?:[,]\d)(\d)?$/;
            } else {
                TIME_REGEXP = /^(?:\d+:)?(?:[0-5]\d:|[0-9]:)?(?:[0-5]\d|\d|^\d\d\d)(?:[.,]\d\d?)?$/;
                LENGTH_REGEXP = /^(?:\d{1,3})(?:[.]\d)(\d)?$/;
            }

            ctrl.$parsers.unshift(function (viewValue) {
                switch (scope.smartMeasurement) {
                    case 3:
                        REGEX = LENGTH_REGEXP;
                        scope.errorformat = "00" + scope.decimal + "00";
                        break;
                    case 4:
                        REGEX = MULTI_REGEXP;
                        scope.errorformat = "00000";
                        break;
                    default:
                        REGEX = TIME_REGEXP;
                        scope.errorformat = "[hh:mm:]ss" + scope.decimal + "t[h] / [s]ss" + scope.decimal + "t[h]";
                        break;
                }
                if (REGEX.test(viewValue)) {
                    ctrl.$setValidity('mymeasure', true);
                    return viewValue;
                } else {
                    ctrl.$setValidity('mymeasure', false);
                    return undefined;
                }
            });
        }
    };
});
我正在使用Angular 1.06-该项目几乎是在一年前启动的,因此目前升级到1.2并不是一个真正的选项。我在想,也许依赖项上的一个可能会阻止它工作。我将对此进行测试,尽管我觉得不太可能。但这是我能想到的唯一一件可能是错误的事情


如果有人能指出一个错误或建议我去看一个地方,我将不胜感激。

好的,我发现了问题。我将表单字段放在一个循环中,这意味着名称字段不清晰

答案是在循环的每次迭代中添加一个
ng表单
,然后检查该表单的每个字段的错误状态

<form name="form" class="form-horizontal" novalidate>
    form.measurement.$error.measure: {{ form.measurement.$error.measure }} <br/>

    <div class="alert alert-error" ng-show="form.measurement.$error.measure">
        {{ measurementFormat }}
    </div>
    <ul class="unstyled">
        <li class='control-group' ng-class="{error:form.measurement.$error.measure}" ng-repeat="l in loop">
            <ng-form name="loopForm">
                loopForm.measurement.$error.measure: {{ loopForm.measurement.$error.measure }} <br/>
                <input class="input-mini error" type="text" ng-model="measurement" ng-change="setChecked()"
                       name="measurement" smart-measurement=selectedFormat errorformat="measurementFormat" decimal="DECIMAL"/>
                {{measurement}}
            </ng-form>
        </li>
    </ul>
</form>

form.measurement.$error.measurement:{{{form.measurement.$error.measurement}}}
{{measurementFormat}}
  • loopForm.measurement.$error.measurement:{{{loopForm.measurement.$error.measurement}}}
    {{测量}}
我希望这有助于某人:-)

<form name="form" class="form-horizontal" novalidate>
    form.measurement.$error.measure: {{ form.measurement.$error.measure }} <br/>

    <div class="alert alert-error" ng-show="form.measurement.$error.measure">
        {{ measurementFormat }}
    </div>
    <ul class="unstyled">
        <li class='control-group' ng-class="{error:form.measurement.$error.measure}" ng-repeat="l in loop">
            <ng-form name="loopForm">
                loopForm.measurement.$error.measure: {{ loopForm.measurement.$error.measure }} <br/>
                <input class="input-mini error" type="text" ng-model="measurement" ng-change="setChecked()"
                       name="measurement" smart-measurement=selectedFormat errorformat="measurementFormat" decimal="DECIMAL"/>
                {{measurement}}
            </ng-form>
        </li>
    </ul>
</form>