Я пишу веб-игру, которая позволяет вам делать ставки на карточках и торговать ими с другими игроками. Для этого приложения я использую Node, Express, MongoDB и Angular.AngularJS вид не обновляется после смены модели
В представлении показаны аватары и имена игроков вместе с их статусом соединения. Этот статус соединения сохраняется в игровой модели, но также отслеживается в режиме реального времени через socket.io websockets.
Когда игрок присоединяется к игре, сервер отправляет сообщение всем клиентам. Затем клиент проверяет, предназначено ли для них сообщение, сравнивая идентификатор игры.
socketService.on("playerConnection", function(data) {
if (data.gameId === gameId) {
handlePlayerConnection(data);
}
});
Если сообщение предназначено для нашего клиента, данные передаются функции «handlePlayerConnection».
function handlePlayerConnection(data) {
if ($scope.game) {
for (var i = 0; i < $scope.game.players.length; i++) {
if ($scope.game.players[i].user.id === data.userId) {
$scope.game.players[i].isConnected = data.connected;
}
}
}
}
В представлении, я просто привязать игрока аватар «IsConnected», так что он показывает/скрывает, когда игрок соединяется/отсоединяется.
Время от времени игровая модель изменяется (очевидно), и сервер сообщает клиентам (опять же, по сокету) обновить $ scope.game.
Приведенный ниже код показывает, как обновляется $ scope.game.
function getGame(gameId, callback) {
gameService.getGame(gameId, function(err, data) {
if (!err) {
$scope.game = data; // Set game
if (callback) callback(data);
}
});
}
На данный момент, вид в основном заморожены. Он полностью перестает реагировать на соединение и отсоединение проигрывателя. Обновление браузера или контроллера устраняет проблему.
Я зарегистрировал $ scope.game.players для консоли и, похоже, содержит правильные состояния соединения. Вид просто не отвечает. Я попытался реализовать $ scope. $ Apply() различными способами и местами, но все, что дает мне, это «angular.js: 13920 Ошибка: [$ rootScope: inprog] $ apply уже выполняется '. Обтекание $ scope. $ Apply() в $ timeout() избавляется от вышеупомянутой ошибки, но не решает проблему.
Проведя часы, пытаясь исправить это, я мог бы иметь случай туннелирования. Бесконечная преданность любому, кто может мне помочь.
EDIT: Только что реализовано, что все данные сокетов обрабатываются через $ rootScope.apply(). Полный код:
var socket = io.connect("http://localhost:8180/");
return {
on: function(eventName, callback) {
socket.on(eventName, function() {
var args = arguments;
$rootScope.$apply(function() {
callback.apply(socket, args);
});
});
},
emit: function(eventName, data, callback) {
socket.emit(eventName, data, function() {
var args = arguments;
$rootScope.$apply(function() {
if (callback) {
callback.apply(socket, args);
}
});
})
},
off: function(eventName) {
socket.off(eventName);
}
};
Теперь я даже меньше, что делать, хотя ..
К сожалению, эта проверка делает мой взгляд совершенно пустым. Нет данных для отображения. – Daan
Есть ли ошибки в журналах – Andonaeus
Нет ошибок. Просто отсутствие ответа на мой взгляд. – Daan