javascript - 在 Angular 服务/ Controller 中实现安全 $apply 的最佳方法

标签 javascript angularjs socket.io

我在我的 Angular WebApp 中使用 socket.io 客户端。我将其包装在一项服务中,但这可能不一定令人感兴趣。但是,由于传入数据与使用该服务的 Controller 处于不同的范围内,因此我总是必须调用 $scope.$apply。更糟糕的是,我发现在某些情况下(在连接/重新连接期间)我必须使用 safeApply,如 here 所述。 .

我知道这是一个 Angular Anti-Pattern ,但是我看不出解决这个问题的方法。

是否有解决此问题的通用方法(最好在服务内部),不会用大量 $scope.$apply/safeApply 污染 Controller ?

BR, 丹尼尔

这里还有一些代码,可以工作,但不是很好:

angular.module('mean')
    .controller('ConnectionStateController', function ($scope) {
        $scope.safeApply = function (fn) {
            var phase = this.$root.$$phase;
            if (phase == '$apply' || phase == '$digest') {
                if (fn && (typeof (fn) === 'function')) {
                    fn();
                }
            } else {
                this.$apply(fn);
            }
        };

        var socket = io.connect('http://localhost:3000');
        $scope.message = 'Not connected';
        socket.on('connect', function () {
            $scope.safeApply(function () {
                $scope.message = "Connected";
            });
        });
    });

最佳答案

在您的情况下,您知道 socket.io 操作总是将异步运行,这使它成为 valid place to use $scope.$apply (towards the bottom of the page) .

我建议不要使用safeApply 并显式调用$scope.$apply。使用 safeApply 将掩盖实现中的真正错误。此外,如果您将代码包装在服务中,则可以在服务中注入(inject) $rootScope 并调用 $rootScope.$apply 中的异步函数。这样你就不需要在每个 Controller 中调用 $scope.$apply

关于javascript - 在 Angular 服务/ Controller 中实现安全 $apply 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20466205/

相关文章:

python - 未定义,当从 Selenium 触发时,Chrome 通知中未定义

javascript - 尝试建立 Angular 项目时的业力问题

javascript - 任何人都可以使用 socket.io 连接到我的 Node js 服务器吗?

php - socket.io laravel echo 无法在 ubuntu 的生产环境中工作

javascript - Ctrl+单击 Atom 编辑器中的函数名称并跳转到其中

javascript - 我正在尝试调用 JavaScript 函数,但无法访问它,因为显然它是 'undefined'

html - Angularjs UI-路由器问题

node.js - Socket.IO - 打开的连接是一个问题吗?

javascript - 迭代包含 3 列的 Google Sheet 范围

javascript - 如何将前端按钮链接到 Node 事件