Передача данных из службы в шаблон через контроллер и $stateParams

У меня есть служба со следующим кодом:

.service('ChatService', function() {
  return { //Gets Data from controller
    sendData: function(data) { 
      this.chatData = data;
      console.log('this.chatData: '+this.chatData);
    },
    chats: this.chatData,
    getChats: function() {
      return this.chatData;
    },
    getChat: function(chatId) {
      for(i=0; i<this.chats.length; i++) {
        if (this.chats[i].id == chatId) {
          return this.chats[i];
        }
      }
    }
  }
})

Здесь важно то, что sendData извлекает информацию

[{id: 1, message: "Chat Message 1"},{id: 2, message: "Message 2"}]

от контроллера. Затем getChats в службах вызывается $scope.chats = ChatService.getChats(); тем же контроллером для отображения в шаблоне. При нажатии на этот элемент новая страница с дополнительной информацией должна отображать, следовательно, функции getChat и getChats в службе. Код в контроллере для страницы для загрузки более подробной информации:

$scope.chatId = $stateParams.chatId;
$scope.chat = ChatService.getChat($scope.chatId);

Однако я получаю сообщение об ошибке, не могу прочитать длину свойства undefined. Теперь, если я изменю chats: this.ChatData в сервисах на

chats: [{id: 1, message: "Chat Message 1"},{id: 2, message: "Message 2"}]

Это работает как шарм, но мне нужно, чтобы он отображал в реальном времени то, что находится в контроллере, потому что я загружаю и получаю информацию с сервера, которая будет обновляться в режиме реального времени для приложения чата.


person Olli    schedule 09.10.2016    source источник
comment
вы должны использовать SignalR для получения ответа в реальном времени signalr   -  person Maher    schedule 09.10.2016


Ответы (1)


Используйте angular.copy для обновления ссылки:

app.service('ChatService', function() {
    //Gets Data from controller
    this.sendData = function(data) { 
      //this.chatData = data;
      //console.log('this.chatData: '+this.chatData);
      //Use angular.copy
      angular.copy(data, this.chats);
    };
    this.chats = [];
    this.getChats = function() {
      return this.chats;
    };
    this.getChat =  function(chatId) {
      for(i=0; i<this.chats.length; i++) {
        if (this.chats[i].id == chatId) {
          return this.chats[i];
        };
      };
    };
});

Используя angular.copy для обновления ссылки на массив, контроллеры, которые ранее получили ссылку, будут обновлены.

Для получения дополнительной информации см. Справочник по API AngularJS angular.copy.

person georgeawg    schedule 09.10.2016