【发布时间】:2016-03-31 12:22:06
【问题描述】:
我使用 AngularJS、.NET 4.5 和 SignalR 制作了一个 Web 应用程序。 应用程序中的一页包含要执行的任务列表,我通过 AJAX 和 Web 方法从服务器获取任务列表。
之后,我注册到 SignalR Hub,它的工作是更新任务状态。
我有角度服务用于连接 SignalR 以及函数的开、关和调用:
.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();
}
我的问题是,“taskStatusChanged”函数中的客户端函数不知道更新的 $scope 变量。 即使我是通过 ajax 从服务器获取它,$scope.levelTasks 也不受限制。如果我将“taskStatusChanged”函数移动到 ajax 回调(其中 $scope.levelTasks 正在初始化),那么该函数将知道 $scope.levelTasks 但会注册多次(每次我从服务器获取任务时)
客户端 SignalR 函数是否可以访问更新后的 $scope 变量?
【问题讨论】:
标签: c# asp.net angularjs angularjs-scope signalr