我有一些代码可以更新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;
}
}
这实际上有效,除了网页在下次点击页面上的按钮之前不会更新绑定。它与以前的代码相同,但现在它只是在回调中。为什么我的页面不会立即更新?
答案 0 :(得分:3)
如果Angular在外部&#39;期间发生变化,它会自动注意到范围的变化。回调。
在这种情况下,您需要告诉角度范围已经自行更改,并且您通过将代码包装在$scope.apply
块中来执行此操作:
这里有一个很好的解释:http://jimhoskins.com/2012/12/17/angularjs-and-apply.html