gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 23:20:03 24 4
gpt4 key购买 nike

我在我的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com