Javascript 如何处理角度服务中的信号器事件?
我有一个Angular应用程序,它有一个结束信号器交互的服务。我可以从页面和Angular服务中向服务器发送数据,但只能处理页面中的事件(服务中的事件从不触发) 在某些情况下,这是一个测试应用程序,用于在与正在播放的视频不同的窗口中设置视频控件 信号机集线器代码Javascript 如何处理角度服务中的信号器事件?,javascript,jquery,asp.net,angularjs,signalr,Javascript,Jquery,Asp.net,Angularjs,Signalr,我有一个Angular应用程序,它有一个结束信号器交互的服务。我可以从页面和Angular服务中向服务器发送数据,但只能处理页面中的事件(服务中的事件从不触发) 在某些情况下,这是一个测试应用程序,用于在与正在播放的视频不同的窗口中设置视频控件 信号机集线器代码 public class VideoHub : Hub { public void SetPlaybackStatus(string status) { Clients.All.statusChanged
public class VideoHub : Hub
{
public void SetPlaybackStatus(string status)
{
Clients.All.statusChanged(status);
}
}
commsTest.service('signalRService', [
'$', function ($) {
var proxy,
initialized = false,
statusChangeCallbacks = [];
var initialize = function (callback) {
// Get the connection object
var connection = $.hubConnection();
// Create proxy
proxy = connection.createHubProxy('videoHub');
// Start connection
connection.start().done(function () {
initialized = true;
console.log("Connected");
callback();
});
// This bit here never fires
proxy.on('statusChanged', function (status) {
console.log("Caught from service.", status);
callStatusChangedCallbacks(status);
});
};
var setPlaybackStatus = function (status) {
if (!initialized) {
initialize(function() {
setPlaybackStatus(status);
});
} else {
// This bit works as expected
proxy.invoke('setPlaybackStatus', status);
}
};
var onStatusChanged = function (callback) {
if (callback) {
statusChangeCallbacks.push(callback);
}
};
function callStatusChangedCallbacks(status) {
for (var i = statusChangeCallbacks.length - 1; i >= 0; i--) {
statusChangeCallbacks[i](status);
}
}
return {
onStatusChanged: onStatusChanged,
setPlaybackStatus: setPlaybackStatus
};
}
]);
角度控制器
commsTest.controller("videoController", [
'$scope', 'signalRService',
function ($scope, signalRService) {
$scope.playbackStatus = "No Status";
signalRService.onStatusChanged(function (status) {
console.log("Callback status", status);
$scope.playbackStatus = status;
});
}
]);
信号机角度服务
public class VideoHub : Hub
{
public void SetPlaybackStatus(string status)
{
Clients.All.statusChanged(status);
}
}
commsTest.service('signalRService', [
'$', function ($) {
var proxy,
initialized = false,
statusChangeCallbacks = [];
var initialize = function (callback) {
// Get the connection object
var connection = $.hubConnection();
// Create proxy
proxy = connection.createHubProxy('videoHub');
// Start connection
connection.start().done(function () {
initialized = true;
console.log("Connected");
callback();
});
// This bit here never fires
proxy.on('statusChanged', function (status) {
console.log("Caught from service.", status);
callStatusChangedCallbacks(status);
});
};
var setPlaybackStatus = function (status) {
if (!initialized) {
initialize(function() {
setPlaybackStatus(status);
});
} else {
// This bit works as expected
proxy.invoke('setPlaybackStatus', status);
}
};
var onStatusChanged = function (callback) {
if (callback) {
statusChangeCallbacks.push(callback);
}
};
function callStatusChangedCallbacks(status) {
for (var i = statusChangeCallbacks.length - 1; i >= 0; i--) {
statusChangeCallbacks[i](status);
}
}
return {
onStatusChanged: onStatusChanged,
setPlaybackStatus: setPlaybackStatus
};
}
]);
事件处理程序(上面标记)从不在服务内激发。我在页面上直接显示了以下代码:
$(function() {
// Gett the connection object
var connection = $.hubConnection();
// Create proxy
var proxy = connection.createHubProxy('videoHub');
// Start connection
connection.start();
// This gets called as expected
proxy.on('statusChanged', function (status) {
console.log("Caught in page.", status);
});
})
这将在服务器代码发出更新时按预期触发
我还尝试在JS端使用直接方法而不是代理,但得到了相同的结果
i、 e
Angular中对象的封装是否会阻止JS接收事件
为了完成起见,我将jQuery作为如下内容传递:
var commsTest = angular.module('commsTest', ['ngRoute'])
.config(['$locationProvider', '$routeProvider', '$httpProvider', function ($locationProvider, $routeProvider, $httpProvider) {
delete $httpProvider.defaults.headers.common['X-Requested-With'];
// Routes stuff
}]);
commsTest.value('$', $);
欢迎提出任何建议。对我有用。这是我的名片。一些修改:1。将
代理移动到连接开始之前的上。使用$log
而不是控制台
我无法使用angular 1.2.12和SignalR 2.0再现您的问题(使用您的代码而不进行更改)@LostInComputer-谢谢!在连接之前移动代理。在
上。启动
修复它。老实说,我不知道为什么这会有什么不同,但我很高兴看到这项活动终于启动了!如果你愿意,你可以看看我的名为SignalR.EventAggregatorProxy的库,它的设计考虑了SPA。