2016-07-17 15 views
9

Ich möchte die Daten über init aus meiner Kundentabelle in die Projektliste aufnehmen.Verknüpfen von abgeflachten Daten

Modell ist wie folgt:

  • Projekte

    • Schlüssel
    • Name: string
    • Kunde: CustomerKey
  • Kunden

    • Schlüssel
    • Name: string

Haben Sie ein Beispiel haben, wie ich dies mit angularfire2 von angular2 Komponente tun?

mein Controller sieht wie folgt aus:

import { Component, OnInit } from '@angular/core'; 
import { Project } from '../project'; 
import { Router } from '@angular/router'; 
import { FirebaseAuth } from 'angularfire2'; 
import { AngularFire, FirebaseListObservable, FirebaseObjectObservable } from 'angularfire2'; 
import { Observable } from 'rxjs'; 

@Component({ 
    moduleId: module.id, 
    selector: 'app-projects', 
    templateUrl: 'projects.component.html', 
    styleUrls: ['projects.component.css'] 
}) 
export class ProjectsComponent implements OnInit { 

    projects: FirebaseListObservable<any[]>; 
    customers: FirebaseListObservable<any[]>; 
    projectName: string; 
    constructor(
    private router: Router, 
    private af: AngularFire 
) { }; 

    ngOnInit() { 
    this.projects = this.af.database.list('projects'); 
    } 

    add(projectName: string) { 
    this.af.database.list('projects') 
     .push({ name: projectName, id: '123' }); 
    this.projectName = null; 
    } 
} 

aktualisieren

i die Art der this.projects auf beobachtbare von FirebaseListObservable geändert haben meine auf ngOnInit() -Methode nun wie folgt aussieht:

ich kann jetzt nicht auf den Namen Eigenschaft des Kunden von der Vorlage im Inneren zugreifen von

<li *ngFor="let project of projects | async"> 

project.customer.$value 
+2

Können Sie mehr Kontext bereitstellen, indem Sie Ihre Vorlage anzeigen oder noch besser, indem Sie eine PLNKR erstellen? –

+0

Hallo David, habe gerade die Modellbeschreibung zum Beitrag hinzugefügt. Innerhalb der Vorlage ist nichts besonderes -> "Projekt von Projekten | async" lassen. Mein Problem ist, wie man verwandten Kunden bekommt.Name aus der Kunden-Tabelle beim Streaming der Daten aus den "Projekten" und setzen Sie die this.project.customer auf diesen Wert – Alex

Antwort

4

Nicht genau sicher, wie Ihr Dataset aussieht, also werde ich nur ein einfaches Beispiel schreiben. Unter der Annahme einer Struktur etwas wie folgt aus:

- projects 
    - key 
    - name: string 
    - customers 
     - customerKey: boolean 

- customers 
    - key 
    - name: string 

Beispieldaten

- projects 
    - projectId1 
    - name: "Cool project!", 
    - customers 
     - customerId1: true, 
     - customerId2: true 
    - projectId2 
    - name: "Another cool project!", 
    - customers 
     - customerId2: true, 
     - customerId3: true 

- customers 
    - customerId1 
    - name: "John Smith" 
    - customerId2 
    - name: "John Doe" 
    - customerId3 
    - name: "John John" 

So sind wir den Kundenschlüssel in jedem Projekte customers Eigenschaft zu speichern.

Sagen wir, wir wollen alle Projekte auflisten, aber wir wollen auch den richtigen Namen der Kunden, nicht nur ihre ID. Da firebase keine Joins hat, müssen wir dies manuell tun. Hier ist eine Möglichkeit, es zu tun:

this.projects = this.af.database.list(`projects`) 
    .map(projects => { 
    return projects.map(project => { 
     project.customers.map(customer => { 
     this.af.database.list(`customers`) 
      .subscribe(c => { 
      customer = c; 
      }); 
     }); 
     return project; 
    }); 
    }); 

Die innere .subscribe zu einem einfachen .map geändert werden könnten, wenn Sie die Daten asynchron erhalten möchten (in diesem Fall verwenden Sie die async Rohr im template`).

+0

Vielen Dank für Ihre Antwort. Genau genommen ist das Kundenfeld in einem Projekt nur ein Verweis auf den Kundendatensatz in der Kundentabelle. Leider über die Art der FirebaseListObservable beschweren Typoskript, wenn ich Ihren Code Typ ‚beobachtbare ‘ verwenden ist nicht übertragbar ‚FirebaseListObservable ‘ eingeben. Die Eigenschaft '_ref' fehlt im Typ 'Observable '. – Alex

+0

Sie können 'FirebaseListObservable' Typ zu' Observable' ändern, es sollte funktionieren. –

+0

+1 an @JohnSmith. Dies ist ein aktuelles Problem mit der Bibliothek, an der wir arbeiten, es ist noch in der Beta, also sei nett :) –

Verwandte Themen