【发布时间】:2014-01-08 21:41:33
【问题描述】:
我一直在使用这里由 brian ford 描述的套接字工厂 http://www.html5rocks.com/en/tutorials/frameworks/angular-websockets/
这里是工厂 myApp.factory('socket', function ($rootScope) {
var socket = io.connect('url');
return {
on: function (eventName, callback) {
socket.on(eventName, function () {
var args = arguments;
$rootScope.$apply(function () {
callback.apply(socket, args);
});
});
},
emit: function (eventName, data, callback) {
socket.emit(eventName, data, function () {
var args = arguments;
$rootScope.$apply(function () {
if (callback) {
callback.apply(socket, args);
}
});
})
}
};
});
我的控制器初始化函数中有一个 socket.emit,每当我从另一个页面重新进入这个控制器时,接收 socket.on 函数就会执行 +1 次。直到我手动刷新页面然后它重置为 1 才会发生这种情况。我没有明确地将我的套接字存储在会话中。那么是什么导致我的 socket.on 多次调用。
这是我的控制器中的 socket.emt 这总是执行一次。
$scope.init = funciton (){
...
socket.emit('getSignedSlidesFromUrl', $scope.slideLocation);
}
这是我的 socket.on 将收到 'getSignedSlidesFromUrl'
socket.on('signedUrls', function (signedSlides){
console.log('signedUrls socket hit');
$scope.slides = signedSlides;
console.log($scope.slides[0]);
console.log($scope.display);
});
这是我重新进入控制器后的控制台日志示例
即将从 init controllers.js:71 发出 getSignedSlidesFromUrl
display after called $scope.first slide is0 controllers.js:574
flash object is controllers.js:537
signedUrls socket hit controllers.js:816
0 controllers.js:823
signedUrls socket hit controllers.js:816
0 controllers.js:823
如果我再次重新进入控制器,我的日志将变为
signedUrls socket hit controllers.js:816
0 controllers.js:823
signedUrls socket hit controllers.js:816
0 controllers.js:823
signedUrls socket hit controllers.js:816
0 controllers.js:823
【问题讨论】:
标签: sockets angularjs socket.io