これを直接説明する方法さえわかりませんが、試してみます。
はじめに
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 秒ごとに「更新」関数を呼び出し、サーバーからデータを受信してこのサービスを更新するだけでした。コントローラーはこのサービスにアクセスするだけで、すべてが機能していました。
問題
今の問題は、すべての websocket 実装を処理する Java で記述された WebSocket インターフェイスを作成したことです。https://github.com/ziadloo/PhoneGap-Java-WebSocketから取得しました。基本的には、Javascript からアクセスできる Javascript Interface を登録して、Java と通信します。
変更があるたびに、WebSocket を介してサーバーから文字列をプッシュし、更新する必要があることを伝えてから、定期的にデータを照会する代わりに、javascript でサービスから「更新」関数を呼び出します。バカ。
WebSocket はうまく機能しています。私はメッセージが来るのを見ることができます、私はアップデートを呼び出します、それはサーバーからすべてを正しくフェッチし、「アップデート」関数は正しい値で「適用更新」を呼び出します.
しかし、angular Service 内のすべての更新されたデータは表示されません! これらの変更はすべて別のスレッドで実行されているようです!?!? . JavaScript がシングル スレッドであることは知っていますが、そのように思えます。
これをより良い言い方にしましょう: WebView が JavaScript コールバック関数を呼び出すとすぐに、別の JavaScript "スレッド" が実行され、その外部には何もアクセスできないという印象があります。
詳しくは
単純に5 秒ごとに数値を出力する関数を作成しました。Websocket はこの番号を更新します。そして、私の出力は次のとおりです。
N: 1
N: 1
次に、WebSocket が新しい番号 (2) でデータをプッシュした後、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 の問題です。この変数をウィンドウのグローバル変数に設定すると、すべてが正常に割り当てられます。Angular が何らかの形で 2 つの異なる $scopes を作成している可能性はありますか?
Update[2] : もう少し明確にするために: ブラウザーでは、すべてが期待どおりに機能します。これが台無しになるのは、エミュレーターで実行した場合のみです。