2017-03-06 7 views
1

Ok kann mir bitte jemand bitte hier helfen Ich fühle mich verrückt !!!Bindung an beobachtbares Array

Ich habe Probleme, eine Liste zu erhalten, um in angular2 zu aktualisieren, es scheint von sich zu schauen, sollte ich Observables irgendeiner Art verwenden?

Alles klingt gut, aber ich habe viele Probleme, sie zu implementieren.

Ich brauche Hilfe bei der Verwendung eines beobachtbaren Array und binden Sie an es in angular2 und was sind die Vorteile der Verwendung eines beobachtbaren Array?

Zum Beispiel habe ich eine Liste von Kommentaren in einem Modell

this.comments = new Array<IComment>; 
    this.observableComments = Observable.from(this.comments); 
    // Note what is really odd with the above is typescript thinks 
    // the above is Observable<IComment> ??? not Observable<IComment[]> 
    // but when i debug it is ObservableArray with array property - ?? 

Ich habe folgendes div in meiner Vorlage

<div *ngFor="let comment of comments | async | reverseOrder let i = index" >

Ok, so weit so gut, aber es scheint keine Fähigkeit zu sein, ein OnNext mit meinem Observable zu tun oder zu tun?! ?? !!

Ich habe eine Funktion namens addComment. Alles, was ich tun möchte, ist, einen Wert zu meinem beobachtbaren Array hinzuzufügen, damit meine Benutzeroberfläche aktualisiert wird. Ich verwende keine Datendienste hier ..

addComment(comment: IComment) { 
    this.comments.push(comment); 
    this.observableComments.onNext(this.comments); 
    // The above does not work 
    // neither onNext - next - push is a function on my observable array?? 
} 

Ich habe viele verschiedene Such getan und es gibt Vorschläge der Verwendung von Rx Themen und behaviourSubjects aber keine Beispiele dafür, wie auf diese in meinem UI zu binden. Ich verstehe, dass dies Streams sind, aber ich kann nicht verstehen, wie dies mit meinen Rohren funktionieren würde und wieder kein Beispiel dafür bestellen

Wenn ich direkt an mein Array binden erkennt Angular2 die Änderungen des Push nicht, weil es das ist gleiche Referenz.

Anderer Vorschlag war, Observables überhaupt nicht zu verwenden, und nur array.concat zu tun, um ein neues Array und eine neue Referenz zu erstellen. Das scheint mir verrückt zu sein !!!

ObservableArrays scheinen mir sinnlos was bekomme ich nicht? Sie scheinen das Array sicher nicht zu beobachten, erlauben mir, einen neuen Array-Wert zu setzen oder mir die Fähigkeit zu geben, auf das Array zu drücken.

+0

Gibt es in Ihrem Komponentenerfassungs OnPush ändern muss? Observable kann kein Ereignis wie onNext ausgeben. Sie sollten Subject oder BehaviorSubject verwenden. Mit Observable können Sie versuchen, 'this.observableComments = Observable.from (this.comments);' nach dem Hinzufügen wieder – yurzui

+0

Nein, nicht mit onPush, kann ich dies zu aktualisieren, indem Sie ein Ereignis abonnieren und mit der geändertenDetectorRef und durch Ändern die Referenz des Arrays. Aber ich möchte Observables und die Vorteile ihrer Verwendung verstehen –

+0

Hier ist ein Beispiel für die Verwendung von BehaviorSubject im Service https://github.com/jhades/angular2-rxjs-observable-data-services/blob/master/src/state /TodoStore.ts – yurzui

Antwort

2

Sie können versuchen, diesen Ansatz:

private comments: IComment[]; 
private observableComments: BehaviorSubject<IComment[]>; 

constructor() { 
    this.comments = new Array<IComment>; 
    this.observableComments = <BehaviorSubject<IComment[]>>new BehaviorSubject([]); 
} 

get comments() { 
    return this.observableComments.asObservable(); 
} 

addComment(comment: IComment) { 
    this.comments.push(comment); 
    this.observableComments.next(Object.assign({}, this.comments)); 
} 
+0

@Annan A. Danke - Das sieht viel näher zu dem, was ich will. Was ist der Vorteil von "Object.assign" und "passing this.comments"? –

+1

Dies ist ein Teil des funktionalen Ansatzes, der versucht, den Status einigermaßen unveränderbar zu halten - eine Kopie statt einer Referenz zu übergeben. –

+0

@Annan A. Danke - ja ich verstehe .. –