2017-01-16 1 views
1

Ich habe diese Funktion, die einige Benutzerdaten aus Firebase aggregiert, um eine "Freundschaftsanfrage" Ansicht zu erstellen. Beim Laden der Seite wird die korrekte Anzahl der Anfragen angezeigt. Wenn ich auf "Akzeptieren" klicke, wird die korrekte Verbindungsanforderung aktualisiert, die dann signalisiert, diese Funktion erneut auszuführen, da der Benutzer sie abonniert hat. Das einzige Problem besteht darin, dass, sobald alle Freundschaftsanfragen akzeptiert sind, der letzte verbleibende Benutzer in der Liste bleibt und nicht verschwindet, obwohl sie bereits akzeptiert wurden.Angular 2 Observables - Leere Antwort auf Aktion zeigt immer noch Daten im Array

Hier ist die Funktion Ich verwende die Anfragen zu erhalten:

getConnectionRequests(userId) { 

    return this._af.database 
     .object(`/social/user_connection_requests/${userId}`) 

     // Switch to the joined observable 
     .switchMap((connections) => { 

     // Delete the properties that will throw errors when requesting 
     // the convo keys 
     delete connections['$key']; 
     delete connections['$exists']; 

     // Get an array of keys from the object returned from Firebase 
     let connectionKeys = Object.keys(connections); 

     // Iterate through the connection keys and remove 
     // any that have already been accepted 

     connectionKeys = connectionKeys.filter(connectionKey => { 

      if(!connections[connectionKey].accepted) { 
      return connectionKey; 
      } 
     }) 

     return Observable.combineLatest(
      connectionKeys.map((connectionKey => { 

       return this._af.database.object(`/social/users/${connectionKey}`) 
      })) 
     ); 
     }); 
    } 

Und hier ist der entsprechende Code in mein Eckige 2 Ansicht (mit Ionic 2):

ionViewDidLoad() { 

    // Get current user (via local storage) and get their pending requests 
    this.storage.get('user').then(user => { 
     this._connections.getConnectionRequests(user.id).subscribe(requests => { 

     this.requests = requests; 
     }) 

    }) 
    } 

Ich fühle mich Ich mache etwas falsch mit meiner beobachtbaren und deshalb ist dieses Problem passiert. Kann jemand das vielleicht etwas beleuchten? Danke im Voraus!

+0

Haben Sie sichergestellt, dass mit 'this.requests = Anfragen,' ein leeres Array wird schließlich empfangen und übertragen? – cartant

+0

Eigentlich ist es komisch. Ich schaue mir die Datenbank an und das "akzeptierte" Feld wird wahr sein, aber was auch immer das letzte Element im Array ist, es bleibt einfach dort. Es sieht nicht so aus, als würde das Subscribe-Signal ausgeben, wenn die Map-Funktion keine Schlüssel zum Iterieren über –

Antwort

2

Ich denke, Sie haben es in Ihrem Kommentar genagelt. Wenn connectionKeys ein leeres Array ist Observable.combineLatest Aufruf ist nicht geeignet:

import 'rxjs/add/observable/of'; 

if (connectionKeys.length === 0) { 
    return Observable.of([]); 
} 
return connectionKeyObservable.combineLatest(
    connectionKeys.map(connectionKey => 
    this._af.database.object(`/social/users/${connectionKey}`) 
) 
); 
+0

hat. Ich denke, diese Antwort sollte jetzt korrekt sein. Ich denke, ich sollte diesen Kaffee auch beenden. – cartant

+0

Oh mein Gott, das hat den Trick gemacht! Was verrückt ist ist, dass ich tatsächlich etwas Ähnliches versucht habe, aber ich habe dieses Import-Statement nicht hinzugefügt haha: P Aber jetzt funktioniert es wie ein Zauber damit! Vielen Dank, ich habe mich stundenlang gegen eine mentale Wand geschlagen <3 –

Verwandte Themen