2017-08-20 57 views
0

是否可以 - 从管道内 - 查询Firebase数据库并返回值?Angular4/AngularFire2:从管道内查询firebase?

我有以下的HTML

<div *ngFor="let item of items"> 
    <h2> 
     {{item.firstName}} {{item.middleName}} {{item.lastName}} 
    </h2> 

    <div *ngFor="let lifeItem of (item.$key | event: 'life')"> 
     Born: {{lifeItem.start}} 
    </div> 
</div> 

而下面的管道:

import { Pipe, PipeTransform } from '@angular/core'; 
import { AngularFireDatabase } from 'angularfire2/database'; 

@Pipe({ 
    name: 'event' 
}) 

export class EventPipe implements PipeTransform { 
    subscriptions: Array<any> = new Array<any>(); 
    items: Array<any> = new Array<any>(); 
    constructor(
     protected db: AngularFireDatabase 
    ){} 

    public transform(personId: any, eventType: any) { 
     if (!personId || !eventType) return []; 

     console.info("personId: " + personId); 
     console.info("eventType: " + eventType); 

     this.subscriptions.push(
      this.db.list('/event', { 
       query: { 
        limitToLast: 200 
       } 
      }).subscribe(items => { 
       console.info(items); 
       this.items = items; 
       return this.items; 
      }) 
     ); 

    } 
} 

当我运行它,我得到这个在控制台...

enter image description here

...但没有任何东西在页面上的相应部分呈现。

回答

1

我认为,这是更好地使用角AsyncPipe

export class EventPipe implements PipeTransform { 
    constructor(protected db: AngularFireDatabase){} 

    public transform(personId: any, eventType: any) { 
     if (!personId || !eventType) return Observable.of([]); 
     return this.db.list('/event', { 
      query: { 
       limitToLast: 200 
      } 
     }); 
    } 
} 

<div *ngFor="let lifeItem of (item.$key | event: 'life' | async)"> 
    Born: {{lifeItem.start}} 
</div> 
+0

你从哪里得到'Observable'?我尝试从'rxjs/Observable'中导入{Observable};'然后它说'''的'属性'不存在'typeof Observable' –

+1

'从'rxjs/Observable'导入{Observable};'和'import' rxjs/add/observable/of';' –

+0

是否有可能进一步过滤管道内的项目。我有这个: 'if(!personId ||!type)return Observable.of([]); \t \t令输出= this.db.list( '/事件',{ 查询:{ \t \t \t \t orderByChild: '人', \t \t \t \t equalTo:PERSONID } \t \t}); \t \t return output;'是否有可能进一步过滤“输出”,以便它只包含与事件类型匹配的项目? –

0

我的猜测是,由于数据库调用是异步操作,因此您必须在数据可用之前考虑延迟。尝试使用

像这样抓.items之前异步管作为二级管和空检查:*ngFor="let lifeItem of (item.$key | event: 'life' | async)?.items"

注:我没有测试此代码自己。只是提出建议。

+0

尝试这个。我不再犯错误,也得不到任何数据。 :-) –

+0

@ eat-sleep-code你有没有改变你的ngFor在最后排除'.items'?我是否明白你现在正在获取数据? – nGAGE