私はMeteorアプリケーションでrxjs MongoObservable.Collectionを使用していますので、コレクション内のドキュメント数を取得する簡単な方法を見つけることができません。MongoObservable.Collection内のドキュメントの数を調べる
私のコレクションにドキュメントがある場合、私のloadData()
メソッドは正常に動作しますが、Observableは空のコレクションの場合はデータが一杯にならないため、このケースの管理方法を理解することはできません。何か案は?
ファイルsummary.collection.ts:
export const Summaries = new MongoObservable.Collection<Summary>('summary');
ファイルsummary.publish.ts:
Meteor.publish('summaries',() => {
return Summaries.collection.find();
});
ファイルsummary.component.ts:
@Component({
selector: 'summary',
template,
})
export class SummaryPage {
loadData() {
Meteor.subscribe('summaries');
this.summariesModel = Summaries.find()
.debounce(() => Observable.interval(500));
this.summariesModel.subscribe(summaries => {
summaries.forEach(summary => {
if (summary.length === 0)
this.state = 'empty'; // <== never reach this point
else
this.state = 'loaded';
});
});
this.summariesModel.zone();
}
}
ファイルsummary.htmlに:
<tr *ngFor="let model of summariesModel | async">
<td> {{model.country}} </td>
<td> {{model.customer}} </td>
</tr>
編集:これを明確にするために、このloadData()メソッドを何度も呼び出し、実際にSummaries.find({customer: 'XYZ Ltd.')のような別のクエリを渡すたびに呼び出します。
私は(* ngIf経由)3つの異なる状態を提供するために、テンプレート(HTML)にthis.state
を使用
:空(表示する「この顧客のデータがありません」); ローディングおよびローディング。
したがって、このクエリで何かが表示されるのを無限に待つことは役に立ちません。
また、回避策(またはこれが唯一の解決策)として、特定のクエリが指定されたドキュメントの合計数を返すメソッドをサーバーに作成しました。そして、クライアント側では、私はこれをしなければならなかった:
asyncSummariesCount(query) {
return new Promise((resolve, reject) => {
Meteor.call('getSummariesCount', query, (err, count) => {
if (err) count = 0;
resolve(count);
});
});
}
async loadData() {
...
if (await this.asyncSummariesCount(query) === 0) {
this.state = 'empty';
return;
}
...
}
それはかなりうまく動作しますが、クライアントが全体に公開コレクションへのアクセスを持っているとして、ドキュメントの合計数を取得しやすくする必要があります。
が見えますか?もしそうなら、それを ''空 ''に初期化するだけではどうですか? – ghybs