javascript - 在 angularjs 服务中捕获按键 - 元素无关

标签 javascript angularjs

我正在尝试按照标题所说的操作,但仍然无法调用任何回调函数。 我想在服务中保留按键检测,并使用“this.keyPressed”成员反射(reflect)按键按下情况。代码对此非常明确。我对观看 Controller 中的事件不感兴趣,我来自 Controller 中。我想创建一个可重用的服务,这样我就可以在其他 Controller 中使用它,而无需重复代码。 我希望能够捕获按键,无论哪个 html 元素具有焦点。

代码:

    'use strict';

app.service(
    'shiftKeyService', ['$rootScope', function ($rootScope) {

        var that = this;

        this.keyPressed = false;
        this.cleanUp = CleanUpService;


        var hUpCleaner = $rootScope.$on("keyup", HandlerUp);
        var hDownCleaner = $rootScope.$on("keydown", HandlerDown);

        $rootScope.$on('keypress', function (e, a, key) {
            alert("gotcha");
        })

        /////////////////////////////////////////////////////////////////////////////
        function CleanUpService() {
            hDownCleaner();
            hDownCleaner();
        }

        function HandlerUp(e) {
            if (e.keyCode === 16) {
                that.keyPressed = false;
            }
        }

        function HandlerDown(e) {
            if (e.keyCode === 16) {
                that.keyPressed = true;
            }
        }
    }]);

最佳答案

这是我为此提供的最终工作服务:

(function (ng, app) {
    'use strict';

    app.service(
        'shiftKeyService', ['$rootScope', function ($rootScope) {

            var that = this;
            var $doc = angular.element(document);

            this.keyPressed = false;
            this.cleanUp = CleanUpService;


            $doc.on("keyup", HandlerUp);
            $doc.on("keydown", HandlerDown);

            /////////////////////////////////////////////////////////////////////////////
            function CleanUpService() {
                $doc.off("keyup", HandlerUp);
                $doc.off("keydown", HandlerDown);
            }

            function HandlerUp(e) {
                if (e.keyCode === 16) {
                    that.keyPressed = false;
                }
            }

            function HandlerDown(e) {
                if (e.keyCode === 16) {
                    that.keyPressed = true;
                }
            }
        }]);

})(angular, myApp);

现在你可以像这样使用它:

(function (ng, app) {

    "use strict";

    app.controller(
        "production.DocumentsController",
        ['$scope', 'shiftKeyService',
        function ($scope, shiftKeyService) {

            //shiftKeyService.keyPressed is your weapon of choice, it's updated on every keyDown/keyUp.

            //and if you no longer require it :
            $scope.$on("$destroy", function () {
                shiftKeyService.CleanUp();
            });          
        }]);
})(angular, myApp);

关于javascript - 在 angularjs 服务中捕获按键 - 元素无关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28745553/

相关文章:

javascript - ClearFix 在 AngularJs 中不起作用

javascript - 获取连接到网络的设备的基本信息

javascript - 带有 var 的 jquery 语法 .css()

angularjs - 如何设置 Angular UI Bootstrap Datepicker 默认设置空字段?

javascript - 与 Knockout 相比,Angular 中表示对象的方式

javascript - 为什么这个 Angular 选择包装器指令不起作用?

javascript - Html Php Ajax 图片上传

javascript - web另一个页面加载后如何进行一些操作?

javascript - jquery mobile phonegap 应用程序的语音文本 api

javascript - AngularJS 应用程序启动时遇到问题