2017-06-06 56 views
3

我正在与angular2/firebase和使用angularfire2模块的项目。我想要一些实时数据,所以我使用angularfire2列表和组件端使用订阅列表。在实时情况下,如果在Firebase数据库中添加了任何新项目,则它会订阅,但没有任何查询。我如何可以用查询存档订阅?我正在使用下面的代码,其中查询是根据我需要数据的某些选择。Angularfire2/Firebase - 查询与angularfire2列表订阅运行时不工作

getRealtimeData(query: any){ 
    if(query){ 
     return this.af.database.list(databaseName+"/messages", { 
      query: { 
       orderByChild: 'is_broadcast', 
       equalTo: query.value 
      } 
     }); 
    } else { 
     return this.af.database.list(databaseName+"/messages", { 
      query: { 
       orderByChild: 'timestamp' 
      } 
     }); 
    } 
} 

我在我的组件调用此创建一个查询

 var query; 
     if (this.isBroadcastMessage && this.isGroupChatMessage || !this.isBroadcastMessage && !this.isGroupChatMessage) { 
      query = null; 
     } else if (this.isBroadcastMessage && !this.isGroupChatMessage) { 
      query = { 
       value: true 
      }; 
     } else if (!this.isBroadcastMessage && this.isGroupChatMessage) { 
      query = { 
       value: false 
      }; 
     } 
     this.firebaseService.getRealtimeData(query).subscribe((data: any) => { 
      console.log("data::", data); 
     }, (error: any) => { 
      console.log("error::", error); 
     }) 
+0

可以提供使用'getRealtimeData'方法的组件代码调用?还有一些你收到的对象的日志? – nisanarz

+0

在描述中添加,我希望我的订阅被查询调用。但它不会被调用查询 –

+0

奇怪,我之前尝试过,它为我工作。唯一的区别是我在我的组件内部而不是在服务中进行了数据库列表查询。你试图这样做? – nisanarz

回答

1

用户ReplaySubject

query$: ReplaySubject<any> = new ReplaySubject(1); 

首先,创建getRealtimeData功能像这样类似这样的

// you no need to pass any argument here 
getRealtimeData():FirebaseListObservable<any>{ 
    return this.af.database.list(databaseName+"/messages", { 
     query: this.query$ 
    }); 

然后

public updateQuery(query: string): void { 
    this.query$.next(query); 
} 

现在

this.firebaseService.getRealtimeData().subscribe((data: any) => { 
     console.log("data::", data); 
    }, (error: any) => { 
     console.log("error::", error); 
    }) 

subscribe功能将被当过您打电话

this.firebaseService.updateQuery({ 
      orderByChild: 'is_broadcast', 
      equalTo: true // false 
     }); 
// or 
this.firebaseService.updateQuery({ 
      orderByChild: 'timestamp' 
     });