2016-07-17 18 views
9

मैं अपने ग्राहकों की तालिका से परियोजना सूची में init पर डेटा में शामिल होना चाहता हूं।फ़्लैटेड डेटा में शामिल होना

मॉडल इस तरह है:

  • परियोजनाओं

    • कुंजी
    • नाम: स्ट्रिंग
    • ग्राहक: customerKey
  • ग्राहकों

    • कुंजी
    • नाम: स्ट्रिंग

मैं कैसे angular2 घटक angularfire2 का उपयोग करने से यह करते हैं, आपको एक उदाहरण है?

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; 
    } 
} 

अद्यतन

मैं ngOnInit() विधि अब इस तरह दिखता है पर FirebaseListObservable मेरे से प्रत्यक्ष करने के लिए this.projects के प्रकार को बदल दिया:

मेरी नियंत्रक इस तरह दिखता है:

ngOnInit() { 
this.projects = this.af.database.list(`projects`) 
    .map(projects => { 
    projects.map(project => { 
     this.af.database.object('customer/' + project.customer + '/name') 
     .subscribe(customer => { 
      project.customer = customer; 
     }) 
     return project; 
    }) 
    return projects; 
    }); 
} 

अब मैं टेम्पलेट से ग्राहक की संपत्ति संपत्ति का उपयोग नहीं कर सकता

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

project.customer.$value 
+2

आप बेहतर अभी तक अपने टेम्पलेट या दिखा रहा है, एक plnkr बना कर अधिक संदर्भ प्रदान कर सकते हैं? –

+0

हाय डेविड, बस पोस्ट में मॉडल विवरण जोड़ा। टेम्पलेट के अंदर कुछ खास नहीं है -> "परियोजनाओं की परियोजना दें | async"। मेरी समस्या यह है कि संबंधित ग्राहक कैसे प्राप्त करें।"प्रोजेक्ट्स" से डेटा स्ट्रीम करते समय ग्राहकों की तालिका से नाम और इस मूल्य को इस.project.customer को सेट करें – Alex

उत्तर

4

नहीं बिल्कुल यकीन है कि कैसे अपने डाटासेट तरह लग रहा है, तो मैं बस एक बुनियादी उदाहरण लिखने के लिए जा रहा हूँ की। इस तरह की एक संरचना कुछ मान लिया जाये:

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

- customers 
    - key 
    - name: string 

उदाहरण डेटा

- 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" 

तो हम customers संपत्ति ग्राहकों की हर परियोजनाओं में कुंजी 'भंडारण कर रहे हैं।

चलो कहते हैं कि हम हर परियोजनाओं की सूची बनाना चाहते हैं, लेकिन हम भी, न सिर्फ उनके आईडी ग्राहकों की वास्तविक नाम के रूप में अच्छी तरह से करना चाहते हैं। चूंकि फायरबेस में शामिल नहीं होता है इसलिए हमें इसे मैन्युअल रूप से करना होगा।

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; 
    }); 
    }); 

भीतरी .subscribe एक सरल .map को बदला जा सकता है आप एसिंक्रोनस रूप से डेटा प्राप्त करने के (इस मामले में template` में async पाइप का उपयोग करें) चाहते हैं: यहाँ एक तरह से यह करने के लिए है।

+0

आपके उत्तर के लिए धन्यवाद। वास्तव में, एक परियोजना के अंदर ग्राहक क्षेत्र ग्राहक तालिका के अंदर ग्राहक रिकॉर्ड का संदर्भ है। दुर्भाग्य से अपने कोड FirebaseListObservable के प्रकार के बारे में शिकायत कर टाइपप्रति अगर मैं का उपयोग प्रकार 'प्रत्यक्ष ' 'FirebaseListObservable ' टाइप करने के लिए आबंटित नहीं है। संपत्ति '_ref' प्रकार 'अवलोकननीय ' में अनुपलब्ध है। – Alex

+0

आप 'फ़ायरबेस लिस्ट ऑब्सर्जेबल 'प्रकार को' अवलोकनयोग्य 'में बदल सकते हैं, इसे काम करना चाहिए। –

+0

+1 @ जॉन स्मिथ के लिए +1। यह लाइब्रेरी के साथ एक वर्तमान मुद्दा है जिस पर हम काम कर रहे हैं, यह अभी भी बीटा में है इसलिए दयालु रहें :) –

संबंधित मुद्दे