3

我正在使用来自已接受答案的指令Set focus on first invalid input in AngularJs form来完成此操作:

app.directive('accessibleForm', function () {
    return {
        restrict: 'A',
        link: function (scope, elem) {

            // set up event handler on the form element
            elem.on('submit', function () {

                console.log("inside focus directive");
                // find the first invalid element
                var firstInvalid = elem[0].querySelector('.ng-invalid');
                //if we find one, set focus
                if (firstInvalid) {
                    firstInvalid.focus();
                }
            });
        }
    };
});

只要我不使用 radios-inline,焦点就可以工作。请参考:http: //jsfiddle.net/mutharasus/mu7y4k8f/

但是,如果第一个错误恰好在 radios-inline 字段上,则焦点不起作用。请参考:http: //jsfiddle.net/mutharasus/00jzbL6g/

我不知道如何解决。请帮忙。

4

2 回答 2

1

我认为问题在于每个收音机的标签都有“.ng-invalid”类,但不是收音机输入元素本身,无论如何都会出现。您的查询选择器无意中返回标签的元素,然后在其上无用地调用 focus()'。

如果无线电无效,这是调用焦点的元素:

<label ng-model="model['Field1']" ng-model-options="form.ngModelOptions" schema-validate="form" class="control-label  ng-valid-schema-form ng-dirty ng-invalid ng-invalid-tv4-302" ng-show="showTitle()">Field1</label>

其他类型控件的标签没有 .ng-invalid 类,因此它们不会受到此问题的困扰。

我不熟悉这些库,所以答案取决于。改进选择器或更改单选输入标签的样式。

这是我破解的 jsFiddle 版本,以证明它是阻止焦点发生的选择器。只需单击提交而不更改表单。

于 2015-11-24T22:43:22.747 回答
1

将类radio-inline添加ng-invalid到字段标签而不是每个单独的无线电输入。

您可以更改该指令并在您的自定义指令中实现您想要的行为(您需要将 ng-invalid 添加到每个无线电输入)或更改accessibleForm指令以检查无效元素是否是标签,在这种情况下,找到与之关联的第一个无线电输入:

app.directive('accessibleForm', function () {
    return {
        restrict: 'A',
        link: function (scope, elem) {

            // set up event handler on the form element
            elem.on('submit', function () {

                console.log("inside focus directive");

                // find the first invalid element
                var firstInvalid = elem[0].querySelector('.ng-invalid');

                // If we got a label, then it is a radio-inline
                if(firstInvalid && firstInvalid.tagName === 'LABEL') {
                    firstInvalid =  elem[0].querySelector('.ng-invalid + div input[type=radio]')
                }

                firstInvalid && firstInvalid.focus();

            });
        }
    };
});

尽管这似乎是最简单的解决方案,但对于我来说,第二个查询选择器在很大程度上取决于该特定指令的结构,看起来并不合适,就好像它发生了变化,那么该accessibleForm指令将再次被破坏。

于 2015-11-24T22:50:51.867 回答