почему новое сообщение отображается только при обновлении веб-страницы, а не в режиме реального времени

0

Теперь я пытаюсь использовать socket.io и angularJS для написания программы чата, базовая настройка - это одно "задание", в котором есть два "чата", частный и публичный.

В настоящее время я могу опубликовать новое сообщение, сохранить его в базе данных (mongodb) и отобразить новое сообщение на веб-странице, обновив (используя некоторые вещи angularJS).

Однако, после добавления некоторых кодов socket.io, новое сообщение по-прежнему невозможно отобразить в реальном времени, я совершенно не понимаю, почему?

Вот ссылка, которую я использую: https://www.youtube.com/watch?v=kyPiJEVQ6cU

Вот соответствующие коды, которые я написал:

дБ/модель/chat.js

var chatSchema = new mongoose.Schema({

  chatType: String,
  messages: [{
    text: String,
    time: {type: Date, default: Date.now}, 
    user: {type: mongoose.Schema.Types.ObjectId, ref: 'User'}
  }]
});

chatSchema.methods.addMessage = function(UserID, Text) {

  var message = {
    text: Text,
    user: UserID
  };

  this.messages.push(message);
  this.save(function(err) {

    if (err) {
      return (err);
    }
  });
};

общественные /JS/услуги /ChatService.js

...
.factory ('socketio', ['$rootScope', function($rootScope){

  var socket = io.connect();
  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);
          }
        });
      });
    }
  };
}]);

общественные /JS/Контроллеры/ChatController.js

// some more codes here

.controller('ChatController', ['Chat', 'socketio', '$scope', '$routeParams', ChatController]);

function ChatController(Chat, socketio, $scope, $routeParams) {
  'use strict';

  var vm = this;
  vm.urlJobname = $routeParams.jobname;
  vm.chatType = $scope.chatType;

  // get all history messages
  Chat.all(vm.urlJobname, vm.chatType).success(function(data) {
    vm.allmessages = data;
  });

  socketio.on('news', function(data) {
    vm.allmessages.push(data);
  });

  // some more codes here

}

маршруты/API/chat.js

api.post('/jobs/:jobname/chats/:chatType', function(req, res) {

  Job
    .findOne({
      jobname: req.params.jobname
    })
    .populate('privateChat publicChat')
    .exec(function(err, job) {

      if (err) {
        res.send(err);
        return;
      }

      if (!job) {
        res.status(404).send({
          success: false,
          message: "job not found"
        });
      } else {

        if (req.params.chatType == "privateChat") {
          if (req.body.text) {
            job.privateChat.addMessage(req.decoded.id, req.body.text);

            io.emit = ('news',

              {
                text: "Welcome to private chat",
                user: {
                  username: "John",
                  firstName: "John",
                  lastName: "Smith"
                },
                time: "2015-06-25T16:21:05.862Z"
              }
            );

            res.json({
              success: true,
              message: 'new message is posted!'
            });

          } else {
            res.json({
              success: false,
              message: 'please type your message'
            });
          }
        } else if (req.params.chatType == "publicChat") {
          //the same as public chat
        } else {
          // some more codes here
        }
      }
    });
});

общественности/просмотров/обертоны/chat.html

   <div class="row msg-container" ng-repeat="message in chatCtrl.allmessages">
     <div class="col-md-12 col-xs-12">
       <strong class="chat-msg-author">{{message.user.firstName}} {{message.user.lastName}}</strong>
       <p>{{message.text}}</p>
       <p>{{message.time}}</p>
     </div>
   </div>

Я думаю, проблема возникает с методом.on и.emit или с моделью сообщений/чатов?

Любой ответ будет оценен. Спасибо!

Теги:
socket.io

1 ответ

0
Лучший ответ

Здесь есть опечатка:

io.emit = ('news',...

Должен быть:

io.emit ('news',...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню