当代码在SignalR回调中时,AngularJS绑定被延迟

时间:2014-04-11 14:08:55

标签: javascript angularjs signalr

我有一些代码可以更新AngularJS $ scope属性。如果此代码在函数中运行,则会立即更新网页。但是,当在SignalR回调函数内运行时,相同的代码不会立即更新网页。

导致绑定立即更新的代码:

带有Angular绑定的HTML:

<input id="name" type="text" ng-model="playerName" /><button ng-click="RegisterPlayer();">Register</button>

Angular控制器中的功能:

  $scope.RegisterPlayer = function () {

      $scope.numberOfPlayers += 1;
      var player = {
          name: $scope.playerName,
          randomNumber: 0,
          totalScore: 0
      }
      $scope.players.push(player);
  }

当此项运行时,会立即在网页上更新播放器数量。

以下是我如何重构代码以将信息发送到SignalR集线器,然后在SignalR回调中使用相同的代码:

这是与上面相同的功能,但现在它只是将信息发送到SignalR集线器:

  $scope.RegisterPlayer = function () {

      hub.server.send($scope.playerName, -1);
  }

这是回调中的代码(它确实被命中,所以接线正确完成):

  function receiveSignalRMessage(name, message) {
      var randomNumber = parseInt(message, 10);

      // -1 means the player was registered
      if (randomNumber == -1) {
          $scope.numberOfPlayers += 1;
          var player = {
              name: $scope.playerName,
              randomNumber: 0,
              totalScore: 0
          }
          $scope.players.push(player);
          return;
      }
  }

这实际上有效,除了网页在下次点击页面上的按钮之前不会更新绑定。它与以前的代码相同,但现在它只是在回调中。为什么我的页面不会立即更新?

1 个答案:

答案 0 :(得分:3)

如果Angular在外部&#39;期间发生变化,它会自动注意到范围的变化。回调。

在这种情况下,您需要告诉角度范围已经自行更改,并且您通过将代码包装在$scope.apply块中来执行此操作:

这里有一个很好的解释:http://jimhoskins.com/2012/12/17/angularjs-and-apply.html