У меня есть фабрика "Чат", которая подключается к моему серверу nodejs через socket.io и отправляет сообщение серверу.
.factory('Messages', function($ionicScrollDelegate){
var messages = [];
return {
getMessages : function(){
return messages;
},
setMessage : function(msg){
messages.push(msg);
}
}
})
.factory('Chat', function(Socket, Messages){
Socket.on('onChat', function(data){
if (data.from !== username){
Messages.setMessage({username : data.from, message : data.msg});
}
});
return : {
sendMessage: function(msg){
Messages.setMessage({
username: username,
message: msg
});
Socket.request(route, {
rid: 'AA',
content: msg,
from: username,
target: '*'
}, function() {
});
}
и мой контроллер проверяет сообщения об ошибках с завода.
.controller('livePageCtrl', function($scope, Messages, Chat){
$scope.data = {};
$scope.data.message = "";
$scope.messages = Messages.getMessages();
$scope.sendMessage = function(msg){
Chat.sendMessage(msg);
$scope.data.message = "";
};
});
и моя форма просмотра
<div class="chat">
<div class="row" ng-repeat="message in messages track by $index">
<div class="col col-100"">
{{message.message}}
</div>
</div>
</div>
<input ng-model="data.message" type="text" placeholder="Chat to Room">
<button type="submit" ng-click="sendMessage(data.message)"></button>
Когда я набираю сообщение и нажимаю кнопку для отправки обновленных сообщений arr, и я могу видеть сообщение в DOM, но если я получаю новое сообщение с сервера, мои сообщения arr обновляются, но DOM не обновляется. Только после того, как я начну печатать новое сообщение DOM, и я вижу входящее сообщение. Что я делаю неправильно? Почему мой DOM не обновляется после нового сообщения с сервера? Спасибо всем! И извините за мой английский)
Проблема здесь в том, что цикл $digest
не запускается, скорее всего, потому, что Angular не знает, когда из сокета поступают новые элементы. Угловой нормально запускает цикл $digest
автоматически, например, когда ng-click
запущен или разрешен вызов $http
. Однако в этом случае вам нужно будет вручную вызвать этот процесс.
Можешь попробовать:
Socket.on('onChat', function(data){
if (data.from !== username){
$timeout(function(){
Messages.setMessage({username : data.from, message : data.msg});
});
}
});
Не забудьте импортировать $timeout
на свой чат-завод.
Socket
?