2016-06-02 7 views
1

Mein Backend antwortet immer mit allen verfügbaren Daten und es dauerte eine beträchtliche Zeit. Also werde ich regelmäßig Speicher neu laden und ich habe vor, peekAll() und peekRecord() zu verwenden.peekRecord() funktioniert nicht, aber peekAll() funktioniert

Mein Code ist:

model: function() { 
    return Ember.RSVP.hash({ 
    'clusters': this.store.peekAll('cluster'), 
    'single': this.store.peekRecord('cluster', 'cluster::My') 
}); 

Wenn Code ausgeführt wird, zunächst kann ich sehen, dass diese beiden Elemente enthalten keinen Inhalt. Nach ein paar Sekunden werden die Daten in den Speicher geladen und ich kann die Inhalte "Cluster" in der Vorlage wie erwartet sehen. Aber "single" ist immer noch komplett ohne Inhalt ({{model.single}} gibt nichts in der Vorlage zurück). Aber wenn ich eine Schaltfläche mit Aktion habe:

Ich kann sehen, dass der Datensatz gefunden wurde. Aufzeichnungen sind auch über Ember Inspector verfügbar. Was mache ich falsch das nur peekAll() im Model für mich arbeitet.

+1

Wann laden Sie den Datensatz 'cluster :: My' in den Laden? Wenn es asynchron oder nach Ihrem 'peekRecord' passiert, wird es nicht zurückkehren, während' peekAll' eine aktive Sammlung ist, die aktualisiert wird, wenn der Speicher gefüllt wird. – Kingpin2k

+0

Es geschieht asynchron. Ich dachte, dass diese Methoden denselben Mechanismus verwenden, um Informationen mit etwas Filtern auf peekRecord-Seite zu erhalten. Deine Erklärung macht Sinn, also danke dafür. Was ist der richtige Weg, um Informationen im gleichen Modell zu erhalten? –

Antwort

4

Die Semantik der beiden Methoden sind:

  • store.peekAll gibt eine Live-Array, das als der Speicher aktualisiert wird, aktualisiert wird.
  • store.peekRecord gibt das entsprechende Objekt im aktuellen Cache oder null zurück, und es wird nicht aktualisiert.

Also das Verhalten, das Sie beobachten, ist das erwartete. Wenn Sie die peek Methoden verwenden möchten, ist es ratsam, dass Sie sicherstellen, dass die erste Anforderung vollständig geladen wurde, bevor Sie Daten aus dem Geschäft abrufen.

+0

Danke. Um peekRecord zu verwenden, das wie peekRecord aktualisiert wird, ist es möglich, "" this.store.filter ('cluster', (item) => {return item.id === 'cluster :: My'}) zu verwenden. , "" ". –