我使用AngularJS,.NET 4.5和SignalR创建了一个Web应用程序。 应用程序中的一个页面包含要执行的任务列表,我通过AJAX和Web方法从服务器获取任务列表。
之后,我正在注册SignalR Hub,它的工作就是更新任务状态。
我有连接到SignalR的角度服务以及函数on,off和invoke:
.factory('hubProxy', ['$rootScope',
function ($rootScope) {
function backendFactory(hubName) {
var connection = $.hubConnection("http://localhost:52158/");
var proxy = connection.createHubProxy(hubName);
proxy.on("dummy", function () { // do not remove - dummy is must here
});
connection.start().done(function () { });
return {
on: function (eventName, callback) {
proxy.on(eventName, function (a,b,c,d,e,f,g,h,i,j) {
$rootScope.$apply(function () {
if (callback) {
callback(a,b,c,d,e,f,g,h,i,j);
}
});
});
},
off: function (eventName, callback) {
proxy.off(eventName, function (result) {
$rootScope.$apply(function () {
if (callback) {
callback(result);
}
});
});
},
invoke: function (methodName, arg1, arg2, callback) {
proxy.invoke(methodName, arg1, arg2)
.done(function (result) {
$rootScope.$apply(function () {
if (callback) {
callback(result);
}
});
});
}
};
};
return backendFactory;
}]);
之后我得到了任务中心:
var tasksHub = hubProxy('taskHub');
然后更改任务状态我使用以下内容:
tasksHub.invoke("changeTaskStatus", task, status);
直到这里一切都很完美。
服务器中心功能(changeTaskStatus)执行以下操作:
task.ChangeStatus((GeneralVars.PROJECT_STATUS)status);
Clients.All.taskStatusChanged(task.t_id,status);
所以我得到任务ID和状态,并想在客户端更改它,我得到这样的:
tasksHub.on("taskStatusChanged", function (t_id, status) {
var task = null;
for (var i = 0; i < $scope.levelTasks.length; i++) {
if ($scope.levelTasks[i].t_id == t_id) {
task = $scope.levelTasks[i];
break;
}
}
task.status = status;
$scope.$apply();
}
我的问题是,客户端功能在&#34; taskStatusChanged&#34;函数,不知道更新的$ scope变量。 $ scope.levelTasks即使我从ajax从服务器获取它也是不可取的。如果我正在移动&#34; taskStatusChanged&#34;函数到ajax回调(其中$ scope.levelTasks初始化)所以该函数将知道$ scope.levelTasks但会多次注册(每次我从服务器获取任务)
客户端SignalR功能是否可以访问更新的$ scope varibles?
答案 0 :(得分:1)
所以我要解决的问题是为任务创建服务,然后在signalr函数中我从任务服务中获取任务