2016-10-10 17 views
5

Angular CLI + Firebase + AngularFire2 kullanıyorum, anahtarı kullanarak Firebase'den tek bir nesneyi nasıl sorgulayacağımı bulmaya çalışıyordum.Sorgu tek bir Firebase nesnesini bir hizmetten anahtarla

Temel akış, öğelerin listesini göstermek ve ardından bir öğeye tıklamak, söz konusu öğenin ayrıntı görünümünü getirecektir.

Bu oldukça yaygın bir kullanım durumu olmalı, ancak AngularFire 2 dokümanları bunu nasıl yapabileceğime dair net örnekler vermemektedir.

Öğeleri sorgulamak için bir hizmet kullanmaya çalışıyorum ancak işe yaramıyor.

Bileşen

// COMPONENT 

import { Component, OnInit, OnDestroy } from '@angular/core'; 
import { Router, ActivatedRoute, Params } from '@angular/router'; 
import { AngularFire, FirebaseObjectObservable} from 'angularfire2'; 
import { Subscription } from 'rxjs'; 
import { ItemsService } from '../items.service'; 

@Component({ 
    selector: 'app-item-detail', 
    templateUrl: './item-detail.component.html', 
    styleUrls: ['./item-detail.component.css'] 
}) 
export class ItemDetailComponent implements OnInit, OnDestroy { 

    private subscription: Subscription; 
    private item; 

    constructor(private af: AngularFire, 
       private route: ActivatedRoute, 
       private router: Router, 
       private itemsService: ItemsService) { } 


    ngOnInit() { 
    this.subscription = this.route.params.subscribe(
     (param: any) => { 
     let id = param['id']; 
     console.log('Key: '+ id); 
     this.item = this.itemsService.getItem(id); 
     } 
    ); 
    } 

    ngOnDestroy() { 
    this.subscription.unsubscribe(); 
    } 

} 

Servis

import { Injectable } from '@angular/core'; 
import { Headers, Http, Response } from "@angular/http"; 
import { AngularFire, FirebaseObjectObservable, FirebaseListObservable, FirebaseApp } from 'angularfire2'; 
import 'rxjs/Rx'; 

@Injectable() 
export class ItemsService { 

    private items: FirebaseListObservable<any[]>; 
    private item: FirebaseObjectObservable<any>; 

    constructor(private af: AngularFire) {} 

    getItems(num) { 
    this.items = this.af.database 
     .list('/items', { query: { limitToLast: num | 20} }) 
     .map((arr) => { return arr.reverse() }) as FirebaseListObservable<any[]>; 
    return this.items; 
    } 

    getItem(id: string) { 
    this.item = this.af.database.object('/items/'+id); 
    this.item.subscribe(item => { 
     console.log(item); 
     return item; 
     }); 
    } 

} 

cevap

2

Bu yapmalıyım:

// COMPONENT 
 

 
import { Component, OnInit, OnDestroy } from '@angular/core'; 
 
import { Router, ActivatedRoute, Params } from '@angular/router'; 
 
import { AngularFire, FirebaseObjectObservable} from 'angularfire2'; 
 
import { Subscription } from 'rxjs'; 
 
import { ItemsService } from '../items.service'; 
 

 
@Component({ 
 
    selector: 'app-item-detail', 
 
    templateUrl: './item-detail.component.html', 
 
    styleUrls: ['./item-detail.component.css'] 
 
}) 
 
export class ItemDetailComponent implements OnInit, OnDestroy { 
 

 
    private subscription: Subscription; 
 
    private item; 
 

 
    constructor(private af: AngularFire, 
 
       private route: ActivatedRoute, 
 
       private router: Router, 
 
       private itemsService: ItemsService) { } 
 

 
    
 
    ngOnInit() { 
 
    // get id synchronously, don't need it more then once 
 
    const key: string; 
 
    this.route.params.take(1).subscribe(param => key = param["id"]); 
 
    this.subscription = this.itemsService.getItem(id) 
 
     .subscribe(item => this.item = item) 
 
    } 
 

 
    ngOnDestroy() { 
 
    this.subscription.unsubscribe(); 
 
    } 
 

 
} 
 

 

 
@Injectable() 
 
export class ItemsService { 
 
    ... 
 

 
    getItem(id: string) { 
 
return this.af.database.object('/items/'+id); 
 
    } 
 

 
}

Verilere ihtiyacınız olan Gözlemlenebilir'e abone olmaya çalışın. Hizmet yöntemleriniz Gözlemlenebilir ve Abonelik değil (aksi takdirde gerçekten iyi bir nedeniniz yoksa) dönmelidir.

+0

Bunun için teşekkürler. Yapılandırmayı, 'const' bildirimlerinin başlatılması ve ID yerine getItem (key) kullanılmasından şikayetçiye devam etmesine izin verdim. Ayrıca özel bir öğe beyan etmek zorunda kaldım = {}. Şimdi çalışıyor, ancak veriler görünmeden önce 5-7 saniyelik bir gecikme oluyor. – LifeOnLars

+0

Sayfanın geri kalanı oldukça hızlı yükleniyor ancak toplam süre 10-11 saniye gibi. Yerel dev kurulumun yavaş olup olmadığından emin değilseniz veya bu sadece bir nesneyi sorgulamanın çok iyi bir yolu değilse. Veri miktarı önemsizdir, örnek verilerde sadece 8 metin düğümü vardır. Liste görünümü şu anda aynı verileri yükler ve çok daha hızlıdır. Nesneleri Firebase'den $ anahtar ile almayı kastetmiyor muyuz? – LifeOnLars

+0

Bu CLI sorunu https://github.com/angular/angular-cli/issues/1980, önceden derlenmiş uygulamayı sunucuya yükledikten sonra hızlı olacak. Dev Tools> Network'te kontrol edebilir, ardından sadece WebSocket trafiğini (WS) gösterecek şekilde filtreleyebilirsiniz ... – Sasxa

İlgili konular