我甚至不知道如何直接解释这个问题,但我会尝试。
介绍
我正在使用angularjs构建一个Phonegap应用程序,并尝试通过拼接WebSocket消息来更新我的UI。我曾经有过定期与服务器通信并相应地更改其数据的服务,它工作得非常好。例如:
Service1.js:
var applyUpdate = function (
angular.extend(instance, data);
if (!$rootScope.$$phase) $rootScope.$apply();
};
this.update = function () {
DataProvider.get('getThermostatSettings', {}, applyUpdate, function(){}, true);
}
基本上,我只是每5秒钟调用“update”函数,从服务器接收数据并更新此服务。然后控制器只需访问此服务,一切都正常运行。
问题是,我编写了一个使用Java编写的WebSocket接口,它为我处理所有的WebSocket实现。我从https://github.com/ziadloo/PhoneGap-Java-WebSocket获取了它。它基本上注册了一个JavaScript接口,可从JavaScript访问以与Java通信。
现在每当我有更改时,我只需通过WebSocket从服务器推送一个字符串,表示应该进行更新,然后我从我的JavaScript中调用服务中的“update”函数,而不是定期查询数据,这只是愚蠢的。
WebSockets工作得很好。我可以看到消息的到来,我调用更新,它从服务器正确地获取了所有内容,“update”函数随后使用正确的值调用了“applyUpdate”,甚至调用了“$rootScope.$apply”。
但是,Angular服务中所有更新的数据都不可见!似乎所有这些更改都在运行不同的线程!?!我知道JavaScript是单线程的,但它似乎确实是这样。让我更好地解释一下:我有这样的印象,即当WebView调用JavaScript回调函数时,我有一个不同的JavaScript“线程”正在运行,并且无法访问其外部内容。更多关于此的信息:我编写了一个简单的函数,每5秒输出一个数字。WebSocket更新此数字。我的输出如下:
N: 1
N: 1
在 WebSocket 推送新数字(2)后,我会得到两个打印输出:
N: 1
N: 2
N: 1
N: 2
N: 1
N: 2
有人对此有什么建议吗?有人尝试过类似的事情吗?我不是angular专家,但似乎一旦我从java接口得到回调,一切都会混乱。
我已经查看了:Angularjs model changes after websocket data push from server ,我的代码看起来非常相似。我认为唯一的问题就是这个来自Java的回调。
谢谢
更新:这是一个AngularJS的问题。如果我将这个变量设置为window全局变量,一切都会正常分配。Angular是否可能创建了两个不同的$scopes?
更新[2]:只是为了更清楚一点:在浏览器中,一切都按预期工作。只有当我在模拟器中运行它时,这个东西才会被搞砸。
applyUpdate
中使用的instance
和data
?Data
显然是从 WebSocket 返回的,那么instance
是什么? - Dmitry Evseevvar instance = this;
。这基本上就是this
。那里正在设置值。我已经在这行代码后面放了一个日志来检查这些值是否被正确设置,它们确实被正确设置了。 - José Leal