4

我什至不知道如何直接解释这一点,但我会尝试。

介绍

我正在使用 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]:更清楚一点:在浏览器中,一切都按预期工作。只有当我在模拟器中运行它时,这东西才会搞砸。

4

1 回答 1

2

Angular.js 完全有可能制作两个 $scope。只需查看此截屏视频中的调试。

显示页面上的所有 $scope可能会有所帮助。

您还应该知道,移动设备上的 websocket 并不是最好的主意。根据那次谈话(由具有 websockets 专业知识的 Nodejitsu 员工),崩溃和失败似乎很可能发生。

于 2013-04-01T02:50:27.807 回答