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