javascript - 将 Angular 与 SignalR 结合使用时,当服务中的对象发生更改时,如何通知 Controller ?

标签 javascript c# asp.net angularjs signalr

我有一个相当简单的 Angular 应用程序,带有四个 Controller 和两个服务。一项服务存储数据并与其他 Controller 共享数据,如下所示:

var DataService = function($http) {
    this.testData = [];
}    
MyApp.service('DataService', ["$http", DataService]);

另一个服务包含客户端 SignalR 方法,如下所示:

var HubService = function(DataService) {    
    this.testHub = $.connection.TestHub;
    this.connectionStatus = [];

    this.connectToHub = function(callback) {
        var self = this;
        $.connection.hub.start().done(function() {
            self.connectionStatus.push(1);
            if (callback) {
                callback();
            }
        });
    };  

    this.getSomeData = function (node, callback) {        
        this.testHub.server.getSomeData(node).done(function (response) {            
            if (callback) { callback(); }         
        });
    };  

    this.testHub.client.addData = function(serverData) {
        DataService.testData.push(serverData)   
    };  
}

MyApp.service('HubService', ["DataService", HubService]);

其中服务器端集线器方法类似于

public class TestHub : Hub {
     public void GetSomeData(Node node) {
        var data = _queries.getSomeDataFromAServer();
        Clients.All.addData(data);
     }
}

现在一切正常,我将 DataService 和 HubService 注入(inject)到 Controller 中,我可以调用 HubService.getSomeData() 方法,该方法调用服务器端方法,然后调用客户端 SignalR 方法, DataService.testData 对象已更新。

问题是,直到下一个 $digest 周期(通常是某种 UI 事件)之前, Controller 才会收到此更改的通知。我需要立即通知管制员。我知道通常我可以调用 $scope.$apply() 来手动触发 $digest 周期,但是由于服务方法是直接从服务器端方法调用的,因此无法使用 $scope。

我该怎么办?如何让 Angular 监视服务对象以了解另一个服务的更改,或者如何从服务方法触发所有 Controller 的 $digest 周期?

最佳答案

这可能不是答案,但你会得到如何实现它的机制。

var app = angular.module('plunker', []);

app.service('myService', function($rootScope) {
  var data = 0;
  var id = 0;

  var increment = function() {
    data = data + 1;
    $rootScope.$apply();
    console.log("Incrementing data", data);
  };

  this.start = function() {
    id = setInterval(increment, 500) ;

  };

  this.stop = function() {
    clearInterval(id);
  };

  this.getData = function() { return data; };

}).controller('MainCtrl', function($scope, myService) {
  $scope.service = myService;
  $scope.controllerData = 0;

  $scope.start = function() {
    myService.start();
  };

  $scope.stop = function() {
    myService.stop();
  };

  $scope.$watch('service.getData()', function(newVal) {

    console.log("New Data", newVal);
    $scope.controllerData = newVal;
  });
});

关于javascript - 将 Angular 与 SignalR 结合使用时,当服务中的对象发生更改时,如何通知 Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31046932/

相关文章:

javascript - 在元素外部单击时如何调用函数并避免在单击事件内触发单击?

javascript - 为什么我的两个 if 语句都被激活?

Point 的 C# 程序加法运算符

c# - Azure 事件目录域

c# - 551 发件人地址对您的登录无效

javascript - 如何在网络版谷歌地图中获取当前位置

javascript - $location.path() 转到错误的网址

c# - ASP.NET C# MVC : How do I live without ViewState?

asp.net - .ASPXAUTH cookie 在 session 结束时过期

c# - Paypal 错误从 Asp.net 中的传输流接收到意外的 EOF 或 0 字节