我甚至不知道如何直接解释,但我会尝试的。
介绍
我正在用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工作良好。我可以看到消息到来,我调用更新,它从服务器正确地获取一切,"更新"函数调用"applyUpdate"与正确的值等,甚至"$rootScope"。$apply"被调用。
但是angular Service中所有更新的数据都是不可见的!似乎所有这些变化都是在不同的线程中运行的!? ? ?。我知道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模型在websocket数据从服务器推送后的变化,我的代码看起来非常相似。我认为唯一的问题是来自Java的这个回调。
谢谢
Update:这是AngularJS的一个问题。如果我把这个变量设为window全局变量,所有东西都会正常赋值。有没有可能Angular以某种方式创建了两个不同的$作用域?
Update[2]:只是为了更清楚一点:在浏览器中,一切都如预期的那样工作。只有当我在模拟器中运行时,它才会变得混乱
对于Angular.js来说,创建两个$作用域是完全可能的。请看下面的调试视频。
这可能有助于显示页面上所有的$作用域。
你也应该意识到websockets在移动设备上并不是最好的主意。崩溃和失败似乎是很有可能的,根据谈话(由一个Nodejitsu员工在websockets的专业知识)。