AngularJS Data落后一步

时间:2014-04-01 03:56:01

标签: javascript angularjs sockets

我使用angularJS跟踪地图坐标以更新数据,但是我遇到了一个奇怪的问题,即您在屏幕上看到的数据与console语句不匹配。

zombie.controller("move", function($scope) {
    io.on("location", function(data) {
        console.log(data);
        $scope.location = data.loc;
    })
    $scope.move = function(direction) {
        $scope.title = ": Traveling";
        io.emit("move", {direction:direction});
    }
});

控制台将记录类似:Object {loc: "(59,30)"}

的内容

我们假设之前的数据为Object {loc: "(60,31)"}。当控制台记录(60,31)时,我的页面将打印(59,30)

此外,当页面加载时,初始单击不会显示任何内容,但控制台将记录正确的数据。

我已经尝试在角度函数内部移动io.on('location'),但是如果它在move()内部,它会连续15次变为疯狂并记录下来并且滞后。除了这个问题外,函数外面没问题。有什么想法吗?

2 个答案:

答案 0 :(得分:7)

io.on("location")中的代码由socket.io启动,Angular不知道它,所以它的范围更改直到下一个摘要周期才会反映出来。这可能就是屏幕更新总是落后一步的原因。使用$scope.$apply()强制摘要...

io.on("location", function(data) {
    console.log(data);
    $scope.location = data.loc;
    $scope.$apply();
})

答案 1 :(得分:0)

我同意上述答案,但在某些情况下仍然喜欢输入文字框,

你需要给定时器来正确消化它。

setTimeout(function(){
    $scope.apply();
}, 50);

这解决了我的问题。