2017-10-03 1 views
0

Je suis en train de mettre en œuvre une fonction de rappel dans une classe de service, qui doit renvoyer des données à la classe des composants.Observable dans une fonction de rappel - angulaire 2

ChatComponent.ts

export class ChatComponent implements OnInit { 

    constructor(public _chatService : ChatService) { 
    _chatService.joinChat() 
    } 

    OnInit(){ 

    } 

// I need to get the `msg` object from the ChatService class 
    didReceiveMessage(msg){ 
console.log(“Message received from chat service class”+msg); 
    } 

} 

ChatService.ts

import { Component, Input } from '@angular/core'; 
import { Injectable }  from '@angular/core'; 


@Injectable() 
export class ChatService { 
    public chatObj : SomeChatObject; 

    constructor() { } 

    joinChat(){ 
    //Join chat related functionality 
    this.chatObj.addHandler(this.onMessageReceivedHandler, null, "message"); 
    } 

    onMessageReceivedHandler = (message) => { 
    //Send `message` back to `didReceiveMessage ` method in ChatComponent.ts 
    return true; 
    } 
} 

j'ai vu un exemple d'utilisation Http rappel Observable. Ici, j'ai ajouté mon rappel explicitement en utilisant addHandler. Je vais obtenir l'objet message dans la méthode 'onMessageReceivedHandler'. Mais je dois le passer à ChatComponent. Comment puis-je transmettre les données?

+0

faire une déclaration de retour dans la méthode de rappel. – Jai

Répondre

1

Vous pouvez utiliser un objet pour cela.

En ChatService:

subscribers: Subject[] = []; 

puis dans joinChat

joinChat(userSubject: Subject) { 
    this.subscribers.push(userSubject); 
} 

puis à messageReceivedHandler:

for (let i = 0; i < this.subscribers.length(); i++) { 
    this.subscribers[i].next("Hello"); 
} 

ChatComponent:

constructor(public _chatService : ChatService) { 
    let subject = new Subject(); 
    subject.subscribe(
    msg => console.log(msg); 
); 

    _chatService.joinChat(subject); 
} 

Prenez note: je l'ai écrit ceci de ma tête donc aucune garantie que le code compile ..

+0

Merci pour la réponse. Je vais l'essayer et vous mettre à jour. – Anish

+0

Je suis en mesure d'obtenir le message. Je regardais Sujet dans RxJs. D'où le retard dans la réponse. Je vous remercie. – Anish

2

Je pense que Carsten est bon, vous pouvez utiliser le sujet et le comportement du sujet pour obtenir votre massage reçu

Dans le fichier de service

message:Subject<string> = new Subject(); 

    broadcastMessage(text:string) { 
     this.message.next(text); 
    } 

et dans le fichier composant que vous pouvez vous abonner au sujet du message

this. _chatService.message.subscribe((msg) => { 
    console.log(“Message received from chat service class”+msg); 
}); 
+0

Laissez-moi essayer et mettre à jour – Anish