如何在每次打开模态时将焦点设置在角度ui模态内的textarea?

时间:2015-02-05 15:53:55

标签: angularjs modal-dialog focus angular-ui-bootstrap directive

我在角度ui模态中有一个textarea,当模态可见时需要设置焦点,不能在文档加载,因为它只在第一次打开模态时工作。

模态有一个动画要打开,我需要在动画结束后设置焦点。

根据此处研究的其他问题,我创建了以下指令:

.directive('focusMe', ['$timeout', focusMe]);
  function focusMe($timeout) {
    return function (scope, element) {
    scope.$watch(function () {
      $timeout(function () {
        element[0].focus();
      });
    });
  };
};

但是这个指令总是检查textarea的焦点。由于我的模态有另一个输入字段,当我单击它时,焦点再次更改为使用该指令的textarea。如何设置焦点仅第一次使模态可见?

更新

更多信息: 从某种程度上解决了始终关注textarea的问题。

但是由于我的模态在动画中有淡入淡出,在IE中焦点显示在文本框的上方,在外面,我不得不使用超时来IE设置正确的焦点。那样不是很好。一些更好的方法?

3 个答案:

答案 0 :(得分:8)

我使用带有角度ui-modal指令的以下版本的focus-me指令。

angular.directive('focusMe', function($timeout) {
    return {
        scope: { trigger: '@focusMe' },
        link: function(scope, element) {
            scope.$watch('trigger', function(value) {
                if(value === "true") {
                    $timeout(function() {
                        element[0].focus();
                    });
                }
            });
        }
    };
});

以模态形式使用focus-me指令的示例:

<div class="modal-header">
    some header
</div>
<div class="modal-body">
    <form name="someForm" method="post" novalidate="">
        <fieldset>
            <textarea name="answerField" placeholder="Enter text..."  focus-me="true" ng-model="model.text"></textarea>
        </fieldset>
    </form>
</div>
<div class="modal-footer">
    some footer
</div>

答案 1 :(得分:2)

迟到的答案但是当使用多指令时最好使用attr观察,因为你可能会遇到多指令创建隔离范围的问题

ControlDirectives.directive('focusMe', function ($timeout) {
    return {
        link: function (scope, element, attr) {
            attr.$observe('focusMe', function (value) {
                if (value === "true") {
                    $timeout(function () {
                        element[0].focus();
                    });
                }
            });
        }
    };
});

<input name="baseCode" focus-me="true" type="text"/>

答案 2 :(得分:1)

您必须对此进行测试,我不确定它是否可行,但您是否可以通过简单的方式将脚本嵌入到模态的HTML模板中:

...
<script>document.getElementById('fieldId').focus();</script>
...