Android-телефон Angularjs с помощью веб-сокетов

99
12

Я даже не знаю, как объяснить это напрямую, но я попробую.


Введение


Я создаю приложение Phonegap с angularjs, и я пытаюсь сшить сообщения WebSocket для обновления моего интерфейса. Раньше у меня были службы, которые периодически обменивались данными с сервером и соответственно меняли свои данные, и он работал очень хорошо. Пример:


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, для связи с java.


Каждый раз, когда у меня есть изменения, я просто нажимаю строку с сервера через WebSocket, говоря, что он должен обновляться, а затем я вызываю функцию "update" из службы в своем javascript вместо того, чтобы периодически запрашивать данные, что просто глупо.


WebSockets работают хорошо. Я вижу сообщение, я вызываю обновление, он извлекает все правильно с сервера, функция "update" вызывает "applyUpdate" с правильными значениями и т.д., Даже вызывает "$ rootScope. $Apply".


Но все обновленные данные внутри службы angular не отображаются! Кажется, что все эти изменения выполняются в другом потоке!?!?. Я знаю, что javascript однопоточен, но кажется, что это так.


Позвольте мне сказать это лучше: У меня сложилось впечатление, что как только WebView вызывает функцию обратного вызова javascript, у меня есть другой поток "javascript" javascript, и ничто вне его не может быть доступно


Подробнее об этом


Я написал функцию, которая просто выводит число каждые 5 секунд. Веб-сайт обновляет это число. И мой вывод следующий:


N: 1
N: 1

Затем после того, как WebSocket подталкивает данные новым номером (2), я получаю две печати:


N: 1
N: 2

N: 1
N: 2

N: 1
N: 2


У всех есть какие-то указатели на это? Кто-то пытался сделать что-то подобное? Я не angular pro, но кажется, что все становится испорченным, как только я получаю обратный вызов из интерфейса Java.


Я уже смотрел на: Изменения модели Angularjs после того, как данные веб-сайта выталкиваются с сервера, и мой код выглядит очень похоже. Единственная проблема, я думаю, это обратный вызов от Java.


Спасибо


Обновление. Это проблема с AngularJS. Если я установил эту переменную в глобальную переменную окна, все будет назначено нормально. Возможно ли, что angular каким-то образом создает две разные $-области?


Обновить [2]: просто чтобы быть более понятным: в браузере все работает так, как ожидалось. Только когда я запускаю его в эмуляторе, чтобы эта вещь перепуталась.

спросил(а) 2021-01-25T11:30:20+03:00 4 месяца, 4 недели назад
1
Решение
77

Для Angular.js вполне возможно сделать две $-области. Просто просмотрите отладку этот скринкаст.


Это может помочь показать все области $на странице.

Вы также должны знать, что веб-сайты на мобильных устройствах - не лучшая идея. Сбои и сбои кажутся довольно вероятными, основываясь на этом разговоре (сотрудником Nodejitsu с опытом работы в websockets).

ответил(а) 2021-01-25T11:30:20+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема