2017-12-24 4 views
0

Ich habe eine berechnete Eigenschaft, wo ich versuche, einen Datensatz zu erstellen, wenn einer nicht existiert, aber erhalten Sie eine jQuery.Deferred exception beim Versuch, die berechnete Eigenschaft zu rendern.Ember-Daten: Erstellen Sie einen Datensatz, wenn einer nicht existiert?

Hier ist, was ich bisher:

deadlineDay: computed(function() { 
    const oneWeekFromNow = moment().startOf('day').add(1, 'week'); 
    const store = this.get('store'); 

    return store.queryRecord('deadline-day', { 
    filter: { 
     date: oneWeekFromNow 
    } 
    }).then(result => { 
    if (!result) { 
     result = store.createRecord('deadline-day', { 
     date: oneWeekFromNow 
     }); 

     result.save(); 
    } 

    return result; 
    }); 
}), 

Dann in meinen Vorlagen Ich bin versucht, mit einem einfachen Helfer zu machen:

{{display-date deadlineDay.date}} 

Der {{display-date}} Helfer return date.format('dddd, MMM Do')

nur Anrufe Es sieht so aus, als ob Ember versucht, das Versprechen selbst abzugeben, anstatt darauf zu warten, dass es sich löst.

Diese seit .format zu einem Fehler führt, ist kein Verfahren der Verheißung.

Ich kann mir vorstellen, dass dies ein extrem häufiger Anwendungsfall ist, aber ich habe ein Verständnisvergehen. Viel Hilfe geschätzt!

Ich bin mir nicht sicher, ob es relevant ist, aber mein Hintergrundspeicher ist session über ember-local-storage

Antwort

1

Ich bin damit einverstanden, dass Ember das Versprechen selbst anstatt zu warten, das Versprechen zu lösen zu versuchen kann zu machen. Leider kann ich den Fehler zu diesem Zeitpunkt nicht reproduzieren.

In Ember.js wird normalerweise empfohlen, Datenaufrufe in der Routendatei zu platzieren. Dies ermöglicht das Abfragen/Speichern und alle anderen Datensammlungen, bevor die Vorlagendatei geladen wird. Ihre abgebildete berechnete Eigenschaft zeigt keine abhängigen Schlüssel an. Dies kann die Verschiebung der Aufrufe in die Routendatei für Ihr Szenario rechtfertigen.

generic route.js Beispiel:

import Ember from 'ember'; 

export default Ember.Route.extend({ 
    async model() { 
    let record; 
    record = await this.store.queryRecord('record', { queryParams }); 

    if (!record) { 
     record = this.store.createRecord('record', { properties }); 
    } 

    return record.save(); 
    }, 

}); 

Wenn jedoch ein Versprechen innerhalb einer berechneten Eigenschaft verwendet wird, kann der Autor von Ember Anzünder haben einige zusätzliche hilfreiche Orientierung, die sich lohnen kann. The Guide to Promises in Computed Properties

Verwandte Themen