2017-02-15 8 views
1

Ich versuche, meine Tabelle bei Parent nach Update-Vorgang von Kind-Komponente zu aktualisieren.Angular 2 Observable Aktualisieren

@Service

getLicenses(){ 
    ... 
    return this.http.post(url","",options) 
     .map((result: Response) => result.json()) 
      .map((data: License[]) => { 
       this.licenses = data; 

       return this.licenses; 
      }) 
      .catch(this.handleError); 
} 

@ Stammkomponente

ngOnInit() { 
    this.licenseService.getLicenses().subscribe(licenses => { 
              this.licenses = licenses; 
}); 

Alles sieht bei der Initialisierung gut. Ich habe Daten in der Tabelle. Wenn eine Zeile aus der Tabelle ausgewählt wird, übergebe ich sie an die untergeordnete Komponente und aktualisiere den Vorgang. Nach dem Update möchte ich die Tabelle aktualisieren und getLicenses() -Methode des Dienstes aufrufen. Aber es wird nicht aktualisiert. Wenn ich eine andere Testmethode anrufe, wird meine Tabelle aktualisiert.

getLicenses2(){ 
    this.licenses.pop(); 
    this.licenses.pop(); 
    this.licenses[2].isFree= !this.licenses[2].isFree; 
    } 

Auch ich habe wie unten getestet und dies nicht aktualisiert.

getLicenses2(){ 

     this.http.post(url,"",options) 
      .map((result: Response) => result.json()) 
       .map((data: License[]) => { 
        this.licenses = data; 
        this.licenses.pop(); 
        this.licenses.pop(); 
       }) 
       .catch(this.handleError); 
    } 

Warum funktioniert das, wenn ich das Array manuell ändere? Warum funktioniert nicht, wenn ich Daten von json zuordnen?

Meine Antwort ist OK es gibt keine Ausnahme und erste Initialisierung funktioniert gut.Update Operation ist auch erfolgreich, wenn ich nur Tabelle mit f5 aktualisieren neue Daten kommen. (Ich bin neu in Angular 2)

bearbeiten

Es funktioniert mit oder ohne Subjekt, wenn ich nur Array ändern, aber es funktioniert nicht, wenn ich es in http Post

Ich habe versucht, mit Gegenstand. Diesmal gibt es kein Kind. Initialisierung funktioniert nicht, wenn ich HTTP-Post aufrufen. siehe Testmethoden unten.

@Service ich habe

private licenses2 = new Subject<License[]>(); 
licenses2$ = this.licenses2.asObservable(); 

@ Stammkomponente

ngOnInit() { 
    this.licenseService.licenses2$.subscribe(licenses => { 
     this.licenses = licenses; 
    }); 
    this.licenseService.getLicenses2(); 
} 

arbeitet

getLicenses2() { 
    let test: License[] = []; 
    test.push(new License()); 

    this.licenses2.next(test) 
} 

nicht funktioniert

getLicenses2(){ 
    this.http.post(URL,"",options) 
     .map(response => { 
       this.licenses2.next(response.json() as License[]) 
     }) 
     .catch(this.handleError); 
    } 

Danke.

+0

Nun, wie ändern Sie die Daten in der untergeordneten Komponente und wie Sie sagen, die Eltern über dieser Wandel? Es wäre hilfreich, den Code zu sehen, den Sie in Ihrer untergeordneten Komponente verwenden. –

+0

in Kind Ich rufe nur einen anderen Update-Service und neue Datenfelder buchen dann Datenbank im Backend aktualisieren. Wenn die Rückkehr erfolgreich ist, rufe ich service.getLicenses() von chield auf, so dass es neue aktualisierte Ergebnisse als json zurückgibt und mein Array aktualisiert. – noname

Antwort

1

Eine Lösung ist die Verwendung eines Subject. Wie ich aus Ihren Kommentaren verstehe, versuchen Sie, die Elterntabelle vom Kind zu aktualisieren, und das wird nicht funktionieren, da die Updates nur im Kind vorhanden sind, wenn Sie dies tun. Sie können dem Elternteil also mitteilen, dass er die Daten aktualisieren soll, wenn Sie dies tun müssen.Also versuchen Sie Folgendes:

Deklarieren Sie einen Betreff in Ihrer Eltern:

public static updateStuff: Subject<any> = new Subject(); 

und in Ihrer Mutter Konstruktor abonnieren:

ParentComponent.updateStuff.subscribe(res => { 
    // here fire functions that fetch the data from the api 
    this.getLicenses(); // add this! 
}) 

und in Ihrem Kind Komponente, wenn Sie Änderungen vornehmen, die sein sollten aktualisiert in Eltern tun dies:

ParentComponent.updateStuff.next(false); 

zB wenn nach einer Post-Anfrage in Ihrem Kind:

// this is the method you call in your child component to do the post request 
postChanges() { 
    this.myService.updateTable() 
    .subscribe(data => { 
     this.data = data; 
     ParentComponent.updateStuff.next(false); // add this, will update the parent! 
    }) 
} 

... und dann sollte es funktionieren :) Remeber auch abmelden :)

+0

Aktualisiert meine Frage. Ich bin auch müde mit Subject. Ich denke, das Problem ist anders. Ich folgte diesem Beispiel unter Eltern und Kinder kommunizieren über einen Service-Titel. [link] (https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#parent-to-view-child) – noname

+0

Warum versuchen Sie, das Thema in der Post zu verwenden, Tu das nicht. Führen Sie den Post normalerweise im Child aus und rufen Sie dann 'ParentComponent.updateStuff.next (false)' 'auf, das dann die Lizenzen im Elternteil aktualisiert: – Alex

+0

und setzen Sie den Betreff nicht in den Dienst, der hier nicht benötigt wird. Sieh dir meine Antwort an. Ich werde meine Antwort ein wenig weiter ausarbeiten. – Alex

Verwandte Themen