【问题标题】:Angular directive with $timeout not working in IE带有 $timeout 的 Angular 指令在 IE 中不起作用
【发布时间】:2016-08-12 22:43:41
【问题描述】:

我有一个简单的指令,可以搜索 DOM 以找到匹配的输入并隐藏它们(客户希望能够动态隐藏 soke 字段)。该指令在 Chrome 中运行良好,但在 IE11 中运行良好。 ng-showng-if 是一个有效的替代方案,但应用程序有数千个字段,因此会非常耗时。

我使用 $timeout(function,0) 来让 dom 准备好(我理解它相当于 JQuery 中的 $(document).ready)。

指令如下:

angular.module("ngEnter", [])
    .directive("hideFields", ['$timeout', function (timer) {
        return {
            scope: { permisos: '=permisos' },
            link: function (scope, elem, attr, ngModel) {
                var hideElements = function () {
                    if (scope.permisos) {
                        for (var i = 0; i < scope.permisos.length; i++) {
                            var element = document.getElementById(scope.permisos[i]);
                            while (true) {
                                element = element.parentElement;
                                if (angular.element(element).hasClass('form-group'))
                                    break;
                            }
                            element.style.display = 'none';
                        }
                    }
                }
                timer(hideElements,0);

            }

        };
    }]);

任何想法将不胜感激。提前谢谢!!!!

【问题讨论】:

  • $timeout 不等同于$(document).ready$timeoutwindow.setTimeout 的包装器。
  • while (true) 循环看起来很粗略。
  • @georgeawg 你是完全正确的,但是在执行指令之前,还有另一种方法可以让 dom 准备就绪吗?并且循环可以改进,但这是一个快速而肮脏的尝试。主要问题是它在 IE11 中不起作用。

标签: angularjs angularjs-directive internet-explorer-11


【解决方案1】:

我的好朋友 Jay 帮我解决了这个问题。将超时值增加到 500 就可以了。

原行:timer(hideElements,0);

换行:timer(hideElements,500);

以某种奇怪的方式,IE 中的角度执行管道与 Chrome 中的不同,因此将 $timeout 设置为 0,在 IE 中没有起到作用。无论如何,希望它在未来为其他人节省相同的时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-17
    相关资源
    最近更新 更多