我有一些更新 AngularJS $scope 属性的代码。如果此代码在函数中运行,网页会立即更新。但是,当在 SignalR 回调函数中运行时,相同的代码不会立即更新网页。
导致绑定(bind)立即更新的代码:
带有 Angular 绑定(bind)的 HTML:
<input id="name" type="text" ng-model="playerName" /><button ng-click="RegisterPlayer();">Register</button>
Angular Controller 中的函数:
$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;
}
}
这实际上有效,除了网页不会更新绑定(bind)直到下一次在页面上单击按钮。它和以前的代码一样,但现在它只是在回调中。为什么我的页面不立即更新?
最佳答案
如果在“外部”回调期间发生变化,Angular 不会自动注意到作用域的变化。
在这种情况下,你需要告诉 Angular 作用域已经改变了,你可以通过将代码包装在 $scope.apply
block 中来做到这一点:
这里有一个很好的解释:http://jimhoskins.com/2012/12/17/angularjs-and-apply.html
关于javascript - 当代码在 SignalR 回调中时 AngularJS 绑定(bind)延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23014976/