2017-05-02 6 views
0

私は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; 
    } 
... 
} 

それはかなりうまく動作しますが、クライアントが全体に公開コレクションへのアクセスを持っているとして、ドキュメントの合計数を取得しやすくする必要があります。

+0

が見えますか?もしそうなら、それを ''空 ''に初期化するだけではどうですか? – ghybs

答えて

0

async with elseブロックは役に立ちますか?ここでは一例である:あなたのコレクション内の最後の `summary`ドキュメントを使用して` SummaryPage`インスタンス `state`メンバーを変更しているよう

https://plnkr.co/edit/JZf8BaIfFceJx8HQHGi8

@Component({ 
    selector: 'my-app', 
    template: ` 
     <div> 
     <div *ngIf="obs$ | async; else elseBlock">not empty</div> 
     <ng-template #elseBlock>empty</ng-template> 
     </div> 
    `, 
    }) 
    export class App { 
    s = new Subject(); 
    obs$; 

    constructor() { 
     this.obs$ = this.s.asObservable(); 
     // publish after 5 sec 
     setTimeout(()=> 
      {this.s.next('aaa');} 
     , 5000); 
    } 
    } 
+0

私の質問には、私の場合は空、ロード、ロードの3つの状態があることを説明していないので、私は編集しませんでした。あなたのこの解決策は、2つの状態、すなわちロードされているかロードされていない場合にのみ機能します。 –

+0

どのようにロード状態を識別しますか? –

+0

状態 'ローディング'は、データベースの検索を開始するとき(find())、次の2つの状態があります。ロードが完了すると 'loaded'、この特定のクエリに何もない場合は 'empty'です。 –

関連する問題