Angularjs (1.4.0-5 beta) 指令中的超时只工作一次

Angularjs (1.4.0-5 beta) timeout in directive only works once

问题:

我有一个指令,用于将焦点设置在 HTML 文档中的输入上。然而,文本字段是隐藏的,并通过特定事件(例如按下按钮)激活。要处理渲染时间,需要超时,但只能使用一次。

有关最小示例,请参阅 fiddle

请注意,有一个调试打印,第一次显示大约需要三秒钟,而接下来的时间会立即显示。这表明超时实际上只起作用一次。我该如何解决这个问题,任何帮助将不胜感激!

代码:

HTML(HTML 标记和正文省略)

<div>
    <button ng-click="bool = !bool">Click</button>
    <input ng-show="bool" my-focus="bool"></input>
</div>

AngularJS

var myApp = angular.module("CheckAllModule", []);

myApp.directive('myFocus', function ($compile, $timeout) {
    return {
        restrict: 'A',
        link: function (scope, element, attr) {
            var timer = $timeout(function () {
                scope.$watch(attr.myFocus, function (n, o) {
                    if (n != 0 && n) {
                        console.log(element[0]); // Degub print
                        element[0].focus();
                        element[0].select();
                    }
                });
            }, 3000);
            element.removeAttr("my-focus");
            $compile(element)(scope);
        }
    };
});

更多详情

我当前的 AngularJS 版本是 1.4.0.beta-5,但同样的问题仍然存在于 1.4.0.beta-6。不过在Angular 1.2.1上好像没有问题。

此外,当不隐藏输入时,一切都像魅力一样,指令被调用但超时没有。

即使在 Fiddle 上,焦点甚至第一次都不起作用,但在点击 "run" 后它总是起作用。

如果我正确理解你的问题,我不是 100% 确定,但这会在点击后聚焦输入。

    var myApp = angular.module("CheckAllModule", []);

    myApp.directive('myFocus', function ($compile, $timeout) {
        return {
            restrict: 'A',
            link: function (scope, element, attr) {          
                var focus = function (n,o) {
                    $timeout(function() {
                        if (n != 0 && n) {
                            console.log(element[0]); // Degub print
                            element[0].focus();
                            element[0].select();
                        }
                    }, 3000);
                }

                scope.$watch(attr.myFocus, focus);

                element.removeAttr("my-focus");
                $compile(element)(scope);
            }
        };
    });

希望对您有所帮助!