栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Node.js + AngularJS + socket.io:连接状态并手动断开连接

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Node.js + AngularJS + socket.io:连接状态并手动断开连接

[更新]

$$phase
是Angular的内部私有变量,因此您不应该真正依赖于此类事情。伊戈尔在另一个答案中描述了一些处理此问题的建议,应该改用一些建议(我听说他对Angular知道一两件事。)


当模型发生变化并且事件从Angular框架内触发时,Angular可以根据需要进行脏跟踪并更新任何必要的视图。当您想与Angular 之外
的代码进行交互时,您必须将必要的函数调用包装在

$apply
作用域的方法中,以便Angular知道正在发生的事情。这就是代码读取的原因

$rootScope.$apply(function () {  callback.apply(socket, args);});

等等。它告诉Angular,“采用通常不会触发Angular视图更新的代码,并按应有的方式对待它。”

问题是当您

$apply
已经在通话中时
$apply
拨打电话。例如,以下内容将引发
$apply already in progress
错误:

$rootScope.$apply(function() {  $rootScope.$apply(function() {    // some stuff  });});

根据您的堆栈跟踪,看起来某些调用

emit
(已经使用
$apply
)触发了调用
on
(也使用
$apply
)。为了解决这个问题,我们只需要调用
$apply
如果
$apply
不是已在进行中。值得庆幸的是,作用域上有一个属性
$$phase
,可以告诉我们是否正在进行脏检查。

我们可以轻松地构建一个需要作用域和功能才能运行的功能,然后

$apply
仅在尚未运行该功能的情况下运行该功能:

var safeApply = function(scope, fn) {  if (scope.$$phase) {    fn(); // digest already in progress, just run the function  } else {    scope.$apply(fn); // no digest in progress, run the function with $apply  }};

现在我们可以替换对

$rootScope.$apply(function...);

safeApply($rootScope, function...);

例如,要修改上面的代码,

angular.module('app')  .factory('socket', ['$rootScope', function ($rootScope) {    var safeApply = function(scope, fn) {      if (scope.$$phase) {        fn(); // digest already in progress, just run the function      } else {        scope.$apply(fn); // no digest in progress, run with $apply      }    };    var socket = io.connect();    return {      on: function (eventName, callback) {        socket.on(eventName, function () { var args = arguments;          safeApply($rootScope, function () { callback.apply(socket, args);          });        });      },      emit: function (eventName, data, callback) {        socket.emit(eventName, data, function () {          var args = arguments;          safeApply($rootScope, function () { if (callback) {   callback.apply(socket, args); }          });        })      },      disconnect: function () {        socket.disconnect();      },      socket: socket    };  }]);


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/383963.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号