如何从可观察值中正确获取数组数据?

时间:2019-09-23 15:00:33

标签: javascript angular firebase google-cloud-firestore angularfire2

我需要两个函数来返回所有数据以及特定的过滤数据,但是我的构造是错误的。下面是我想要的“思考”,但是返回的是Subscriptions而不是数组:

   allItems() {

      var collectionAll: AngularFirestoreCollection<Item> =
         this._afs.collection<Item>('items');

      var itemArray$: Observable<Item[]> =
         collectionAll.valueChanges();

      // Returns Subscription but I need Items[]
      return itemArray$.subscribe(items => {
         return items;
      })
   }

   specificItems(name: string) {

      var collectionSpecific: AngularFirestoreCollection<Item> =
         this._afs.collection<Item>('items', ref =>
            ref.where('name', '==', name));

      var itemArray$: Observable<Item[]> =
         collectionSpecific.valueChanges();

      // Returns Subscription but I need Items[]
      return itemArray$.subscribe(items => {
         return items;
      })
   }

我也认为这将需要是一个异步函数,但是订阅函数不会返回promise。

我什至不确定在什么时候从Firestore实际收取读取计数...?

3 个答案:

答案 0 :(得分:1)

如果您想要一个承诺,则需要使用toPromise将Observable转换为Promise:

specificItems(name: string): Promise<Item[]> {
  var collectionSpecific: AngularFirestoreCollection<Item> =
     this._afs.collection<Item>('items', ref =>
        ref.where('name', '==', name));

  var itemArray$: Observable<Item[]> =
     collectionSpecific.valueChanges();

  return itemArray$.toPromise();
}

答案 1 :(得分:0)

可观察性非常强大,您应该保持它们不变。

allItems = this._afs.collection<Item>('items').valueChanges();

在模板中,您只需使用异步管道即可读取数据:

<div *ngFor="let items of allItems | async">...</div>

由于多种原因,这是使用Angular的最强大方法,因此请尝试尽快学习它,因为基本上Angular = RxJS(当然不正确,但是它显示了您在Angular中需要多少RxJS)

答案 2 :(得分:0)

  

在不同的位置声明以下模型,以便您可以重复使用同一模型。

  export class EmployeeRoster {
        RosterDate: Date;
        EmployeeId: number;
        RosterDayName: string;
        ProjectId: number;
        ShiftId: number;
        ShiftTime: string;
        ShiftColor: string;
        IsOnLeave: boolean;
    }
  

在服务层中声明以下方法。

      GetSavedEmployeeData(empIds: EmployeeIdlistToRoster[], sDate: string, eDate: string): Observable<EmployeeRoster[]> { 
        let empIdsValue = '';
        if (empIds !== null && empIds.length > 0) {
          empIds.forEach(function (em) {
            empIdsValue += em.EmpId + ',';
          });
        }

        //How to pass value as a parameter
        const paramsdsf = new HttpParams()
          .set('empIds', empIdsValue)
          .append('sDate', sDate)
          .append('eDate', eDate);
        return this.http.get<EmployeeRoster[]>(apiUrl, { params: paramsdsf });
      }
  

这只是一个示例,您可以根据需要更新此方法和模型。