对Angular控制器的频繁更新未在视图中反映出来

时间:2014-02-02 20:59:37

标签: javascript angularjs signalr

使用SignalR处理一个有趣的Angular和频繁更新问题。

在服务器上,我有一个管理器的单例实例,当前设置为每500ms发送一次更新

    public void StartTest() {
        var i = 0;
        while (i < 1000) {
            if (_cancelRequested) {
                _cancelRequested = false;
                return;
            }
            _context.Clients.All.sent(i++);
            Thread.Sleep(500);            

在我看来我正在使用“controller as vm”语法:

{{vm.status}}

最后在我的控制器中(在signalR初始化时):

    // Using 'Controller As' syntax, so we assign this to the vm variable (for viewmodel).
    var vm = this;
    vm.status = '';
    ...
    function activateSignal() {
        var hub = $.connection.mailerHub;

        hub.client.sent = function (counter) {
            log(' singal_R ## event: sent ' + counter);  // <-- this works on every update
            vm.status = counter;  // this works only on last update, or if stop is pressed it writes the most recent update. 
        };

该代码执行两项操作:写入日志(这会向浏览器发送toastr更新),并在控制器上设置状态变量。

日志注释按预期反映在浏览器中,每半秒我得到带有事件编号的好的toastr通知,但设置变量没有任何影响,直到我请求停止,或者它达到999.

当我按下停止时,vm.status被写出最后一个序列号,或者当整个事件停止时,它会写出999.

所以在vm上设置属性的频率似乎有些问题?我需要像$ scope这样的东西。$ watch让这个工作吗?

1 个答案:

答案 0 :(得分:4)

嗯,对我来说,确切地说你想要实现的目标还不够明确,但看起来你正在更新你的模型以控制角度。因此,您需要通知角度您正在做什么。

最有可能的是,这样的事情可以解决问题:

hub.client.sent = function (counter) {
   $scope.apply(function(){
      log(' singal_R ## event: sent ' + counter);
      vm.status = counter;
   });
};