2017-08-28 43 views
3

我看過類似的問題,但這些問題與我正在處理的數據結構略有不同。我看:加入AngularFire 2

這是我的數據結構:

{ 
    "samples": { 
    "24084": { 
     "addInfo": "TEST", 
     "datePrinted": "8/11/2017 9:42:57 AM", 
     "equipment": "GR028", 
     "hmisNumber": "100E", 
     "lotNumber": "GR0030C659-JM", 
     "productionNumber": "PN0034781", 
     "userName": "MCorbett" 
    }, 
    "24342": { 
     "addInfo": "test", 
     "datePrinted": "8/15/2017 11:51:55 AM", 
     "equipment": "GR025", 
     "hmisNumber": "100", 
     "lotNumber": "BR0010P835", 
     "productionNumber": "PN0035616", 
     "userName": "MCorbett" 
    } 
    }, 
    "scans": { 
    "-Krlb3tv3oFPtYZp2ErX": { 
     "inTime": 1502997139131, 
     "sampleId": "24342" 
    }, 
    "-KrlbdbCT0us6xE9POm3": { 
     "inTime": 1502997289573, 
     "outTime": 1502997292524, 
     "sampleId": "24342" 
    }, 
    "-Krlc3vsjiQ9czWYGvA9": { 
     "inTime": 1502997401784, 
     "outTime": 1502997404864, 
     "sampleId": "24084" 
    } 
    } 
} 

正如你所看到的,樣品以掃描有一對多的關係。我需要做的是填充一個帶有掃描數據的樣本數據的表格。它需要像這樣:

"24342": { 
    "addInfo": "test", 
    "datePrinted": "8/15/2017 11:51:55 AM", 
    "equipment": "GR025", 
    "hmisNumber": "100", 
    "lotNumber": "BR0010P835", 
    "productionNumber": "PN0035616", 
    "userName": "MCorbett", 
    "inTime": 1502996197213 
} 

我需要抓住所有的掃描,其中outTime是不確定的,然後再加入它它的相應的樣本數據。這裏是我到目前爲止已經試過:

// Get samples that have a scan where inTime is populated but outTime is not 
    getOpenSamples() { 
     console.log('getopensmaples stareted') 
     let scanWithSampleList = this.scanSvc.getScansList({ 
       orderBy: 'outTime', 
       startAt: '' 
      }) 
      .switchMap(scans => { 
       let sampleObservables = scans.map(scan => this.getSample(scan.sampleId)); 
       console.log("insisde"); 
       return sampleObservables.length === 0 ? 
        Observable.of(scans) : 
        Observable.combineLatest(sampleObservables, (samples) => { 
         scans.forEach((scan, index) => { 
          scan.productionNumber = samples[index].productionNumer; 
          scan.lotNumbner = samples[index].lotNumber; 
         }); 
         return scans; 
        }); 
      }); 
    } 

這給了我這個錯誤:

ERROR in C:/Users/corbetmw/workspace/angular/sample-time-tracking/src/app/samples/shared/sample.service.ts (82,54): Propert y 'productionNumer' does not exist on type '{}'.

我在做什麼錯在這裏?這看起來很簡單,但我遇到了很多麻煩。我是否需要更改我的數據結構?我應該創建一個組件,使用未定義的outTime獲取Scans,並將其粘貼到可以傳遞樣本ID的父級表中,反之亦然?

+0

謝謝弗蘭克!確實格式正確的確有些麻煩,而其他更多面向風格的選擇可能會做得更好。 –

回答

0

我能找到一個解決方案,它返回一個類型爲Scan<>的可觀察值,其中包含一個Scan

我有這樣的功能:

getOpenScans() { 
 
     const scansList = this.db.list('/scans', ref => ref.orderByChild('outTime').endAt(null)); 
 
     return scansList.snapshotChanges().map(arr => { 
 
      return arr.map(snap => Object.assign(snap.payload.val(), { 
 
       $key: snap.key 
 
      })) 
 
     }) 
 
    }

然後,我有這樣的傢伙:

getOpenSamples() { 
 
    let openScans = this.scanSvc.getOpenScans(); 
 

 
    let fullSamples = openScans.map(scans => { 
 
     for (let scan of scans) { 
 
     scan.sample = this.getSample(scan.sampleId); 
 
     } 
 
     return scans; 
 
    }); 
 
    
 
    //fullSamples.subscribe(samples => console.log(samples)); 
 
    return fullSamples; 
 
    }

我現在想實現THI在Material2中使用MatTable解決方案。