我需要两个函数来返回所有数据以及特定的过滤数据,但是我的构造是错误的。下面是我想要的“思考”,但是返回的是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实际收取读取计数...?
答案 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 });
}
这只是一个示例,您可以根据需要更新此方法和模型。