2017-05-02 4 views
0

Ich verwende rxjs MongoObservable.Collection in meiner Meteor App und kann keinen einfachen Weg finden, um die Anzahl der Dokumente in meiner Sammlung zu erhalten.Verbergen der Anzahl der Dokumente in einer MongoObservable.Collection

Im folgenden Code funktioniert meine loadData() Methode gut, wenn es Dokumente in meiner Sammlung gibt, aber da das Observable nie mit irgendwelchen Daten im Falle einer leeren Sammlung gefüllt wird, kann ich nicht herausfinden, wie man diesen Fall verwaltet. Irgendwelche Ideen?

Datei summary.collection.ts:

export const Summaries = new MongoObservable.Collection<Summary>('summary'); 

Datei summary.publish.ts:

Meteor.publish('summaries',() => { 
    return Summaries.collection.find(); 
}); 

Datei 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(); 
    } 
} 

Datei summary.html :

<tr *ngFor="let model of summariesModel | async"> 
     <td> {{model.country}} </td> 
     <td> {{model.customer}} </td> 
    </tr> 

Bearbeiten: Um es klarer zu machen, rufe ich diese loadData() -Methode viele Male, und jedes Mal, wenn ich tatsächlich eine andere Abfrage wie Summaries.find übergeben ({Kunde: 'XYZ Ltd.').

Ich benutze this.state in der Vorlage (HTML), um 3 verschiedene Zustände zu liefern (über * ngIf): leer (Anzeige ein: 'Es gibt keine Daten für diese Kunden'); wird geladen und geladen.

So gibt es keinen Nutzen für mich zu warten, bis etwas in dieser Abfrage erscheint.

Auch als eine Umgehungsmöglichkeit (oder vielleicht ist dies die einzige Lösung) habe ich eine Methode auf dem Server, die die Gesamtzahl der Dokumente gibt eine bestimmte Abfrage zurückgegeben. Und in der Client-Seite, hatte ich dies zu machen:

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

Es funktioniert ziemlich gut, aber wie der Client Zugriff auf die gesamte veröffentlichte Sammlung hat, sollte es einfacher sein, die Gesamtzahl der Dokumente zu erhalten.

+0

Sieht aus wie Sie Ihr 'SummaryPage' Beispiel' state' Mitglied mit dem letzten 'summary' Dokument in Ihrer Sammlung modifizieren? Wenn ja, warum initiierst du es nicht einfach mit "leer"? – ghybs

Antwort

0

Wird async mit else Block Ihnen helfen? Hier ein Beispiel:

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

Ich bearbeite meine Frage, da ich nicht erklären konnte, dass es in meinem Fall 3 Zustände gibt, leer, geladen und geladen. Diese Lösung von dir funktioniert nur, wenn ich 2 Zustände habe, geladen oder nicht geladen. –

+0

Wie identifizieren Sie den Ladezustand? –

+0

Zustand 'Laden' ist, wenn es beginnt, die Datenbank abzufragen (find()), dann gibt es 2 nächste mögliche Zustände: 'geladen', wenn das Laden beendet ist oder 'leer', wenn in dieser spezifischen Abfrage nichts ist. –

Verwandte Themen