SignalR客户端函数无法访问更新的$ scope变量

时间:2016-03-31 12:22:06

标签: c# asp.net angularjs angularjs-scope signalr

我使用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.levelTask​​s即使我从ajax从服务器获取它也是不可取的。如果我正在移动&#34; taskStatusChanged&#34;函数到ajax回调(其中$ scope.levelTask​​s初始化)所以该函数将知道$ scope.levelTask​​s但会多次注册(每次我从服务器获取任务)

客户端SignalR功能是否可以访问更新的$ scope varibles?

1 个答案:

答案 0 :(得分:1)

所以我要解决的问题是为任务创建服务,然后在signalr函数中我从任务服务中获取任务