0

ich einen Dienst mit dem folgenden Code:

.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]; 
     } 
     } 
    } 
    } 
}) 

Das Wichtige hier ist, dass senddata info

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

von der Steuerung abgerufen werden. Die getChats in Services werden dann von demselben Controller $scope.chats = ChatService.getChats(); aufgerufen, um sie in der Vorlage anzuzeigen. Wenn auf dieses Element geklickt wird, wird eine neue Seite mit weiteren Informationen angezeigt, daher die Funktion getChat und getChats im Dienst. Der Code in der Steuerung für die Seite mehr Details zu laden ist

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

Allerdings kann ich bin immer Fehler nicht Eigentum Länge von undefinierten lesen. Nun, wenn ich ändere, um die chats: this.ChatData in den Diensten

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

Es wirkt wie ein Zauber, aber ich brauche es in Echtzeit angezeigt werden, was in der Steuerung ist, weil ich das Herunterladen und Empfangen von Daten von dem Server, der sein wird, in Echtzeit für eine Chat-App aktualisiert.

+0

Sie haben SignalR zu verwenden, um verfügt über eine Echtzeit-Reaktion [signalr] (https://github.com/JustMaier/angular-signalr-hub) – Maher

Antwort

0

Verwenden angular.copy die Referenz zu aktualisieren:

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]; 
     }; 
     }; 
    }; 
}); 

Durch die angular.copy mit der Array-Referenz zu aktualisieren, Controller, die zuvor die Referenz aktualisiert werden abgeholt haben wird.

Weitere Informationen finden Sie AngularJS angular.copy API Reference.

Verwandte Themen