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