javascript - 从文档绑定(bind)事件触发时,ngClass 类更改很慢

标签 javascript angularjs

我在 Angular 中构建了一个下拉菜单元素指令。 ng单击菜单按钮可切换菜单并无缝工作。但是,当单击发生在外部时,我的 $document.click 绑定(bind)会关闭菜单,需要几秒钟的时间才能发生。

我已在绑定(bind)和 closeMenu 作用域函数上放置了一个断点。这两种情况都会立即发生,但是由我的 ngClass 属性导致的类更改似乎不会在一两秒内更改元素的类。

this video ,我演示了关闭下拉菜单的两种方法:首先,通过单击下拉按钮,该按钮通过 ngClick 触发一个函数来更改 menuActive ,从而关闭事件类。其次,通过单击菜单外部来触发 $document 的单击事件来更改与第一种方法相同的作用域变量。可以看到不使用下拉菜单按钮关闭时大约有2秒的延迟。

这是我的指令:

angular.module('dropdownDirective', [])
    .directive('dropdown', function($document) {
        'use strict';
        return {
            restrict: 'E',
            transclude: true,
            scope: {
                ngIcon: '@',
                ngCaret: '@',
                ngLabel: '@'
            },
            templateUrl: '/gridsmart-web-client/directives/dropdown/dropdown.html',
            link: function(scope, element) {
                var handler = function(event) {
                    if (!element[0].contains(event.target)) {
                        scope.closeMenu();
                    }
                };

                $document.on('click', handler);
                scope.$on('$destroy', function() {
                    $document.off('click', handler);
                });

                scope.clicked = false;
                scope.positionDropdown = function() {
                    if (!scope.clicked) {
                        scope.clicked = true;
                        scope.buttonHeight = element.find('button')[0].offsetHeight + 'px';
                    }
                };
            },
            controller: function($scope) {
                $scope.menuActive = false;
                $scope.toggleMenu = function () {
                    $scope.positionDropdown();
                    $scope.menuActive = !$scope.menuActive;
                };
                $scope.closeMenu = function() {
                    $scope.menuActive = false;
                };
            }
        };
    });

这是下拉菜单的模板:

<div class="dropdown" ng-class="{active: menuActive}">
    <button ng-click="toggleMenu()">{{ngLabel}}<i ng-class="ngIcon" ng-if="ngIcon"></i><b class="caret" ng-if="ngCaret"></b></button>
    <ul ng-show="menuActive" ng-style="{'top': buttonHeight}" ng-transclude>
    </ul>
</div>

按钮的 ngClick 只是切换 menuActive 的值。由于 $document.click 绑定(bind)操作相同的变量,我无法想象为什么类更改会慢得多。

最佳答案

尝试在事件处理程序中调用$apply():

$document.on('click', function(event) {
    handler(event);
    scope.$apply();
});

关于javascript - 从文档绑定(bind)事件触发时,ngClass 类更改很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24655421/

相关文章:

javascript - 将多个 HighCharts 图表导出到 Powerpoint 幻灯片

javascript - 如何做 IF/OR Angular ng-class

angularjs - AngularJS 和 PouchDB 服务的单元测试

javascript - 设置接收到的全日历事件的结束日期失败并出现错误

javascript - 在 JS 中求解 mod 方程

javascript - 有没有工具可以确定我的 jQuery 是否可以跨浏览器运行?

javascript - Twitter-Bootstrap typeahead 不工作

javascript - 防止 Meteor 将脚本包装在立即调用的函数表达式中

javascript - 使用 jQuery/JavaScript 进行组合键

jquery - 当使用 PhoneGap 在移动设备上安装应用程序时,famo.us Surface 中的 iosslider 无法工作