2016-08-04 8 views
1

Manchmal möchten Sie eine Variable, die persistent ist, solange die Seite nicht neu geladen wird. Da viele der Ember-Konvention Objekte erweitern, bin ich nicht sicher, wo private Variablen abgelegt werden sollen, damit sie von öffentlichen Funktionen aus zugänglich sind.Was ist die richtige Methode zum Speichern von persistenten Variablen in Ember RESTAdapter

Es scheint naheliegend, es einfach in das extend() ed-Objekt zu setzen, aber dann ist die Variable nicht innerhalb einer Funktion in demselben Objekt erreichbar, wahrscheinlich weil Ember das übergeordnete Objekt nicht zur Funktion hat.

Hier ist ein Beispiel dafür, wie ich ein Array speichern, so dass ich abziehen kann, wenn meine RESTAdapter einen Datensatz neu zu laden soll, die vor angefordert wurden:

shouldReloadRecord: function(store, snapArray) { 

    window.recordHashStore = window.recordHashStore || []; 
    let recordHash = `${snapArray.modelName}/${snapArray.id}?include=${snapArray.include}`; 
    if (!~window.recordHashStore.indexOf(recordHash)) { 
     window.recordHashStore.push(recordHash); 
     console.log('Reloading', snapArray.type); 
     return true; 
    } 
    else { 
     console.log('NOT reloading', snapArray.type); 
     return false; 
    } 
} 

der entsprechende Code hier window.recordHashStore = window.recordHashStore || [] ist. Das macht genau das, was ich will, aber es sieht nicht sehr nach Ember'y aus. Es ist auch nicht schön, den globalen Bereich window zu verwenden. Wo kann ich private Variablen für die Dauer der App im Browser speichern, damit diese bei Übergängen verfügbar und nicht überschrieben werden?

+0

Warum verwenden Sie hier ein Array? Die Verwendung eines Objekts wird weniger Code und O (1) statt O (n) sein. Ich benutze zweitens einen Dienst für die Daten, auch wenn es trivial ist. –

+0

@PatrickFisher ist eine schnelle Lösung, die mir in den Sinn kam, weil ich darüber nachdachte, Cache als Datensätze im DS-Speicher hinzuzufügen. Es ist jedoch nicht relevant für die Frage. – Redsandro

Antwort

4

Das klingt nach einem guten Anwendungsfall für eine Ember.Service. Ein Dienst ist im Wesentlichen ein Singleton, aber in Ihrem Bereich window/global ist er nicht verfügbar. Es wird auch nicht von Routenübergängen beeinflusst (es sei denn, Sie haben Code, der einen Dienst beim Routenübergang manipuliert).

Sie können Ihren Dienst in Ihren RESTAdapter einfügen und den Status im Dienst speichern.

+0

Upvoted. Ein Service für ein einzelnes Array scheint ein bisschen viel. Gibt es nicht eine globale Funktion, so? (Ich habe das komplett erfunden): 'DS.store.addToSet ('recordHashStore', recordHash)' – Redsandro

+1

@Redsandro gibt es nicht, aber Sie könnten versuchen, diese Methoden hinzuzufügen, indem Sie den Store erweitern. (Anscheinend erweitert der Store Ember.Service auch!) Sehen Sie diese Antwort für ein Beispiel: http://stackoverflow.com/a/34999549/1112407 –

+1

Wenn es nur eine Variable wie eine Host-URL oder etwas ist, könnten Sie das einfach definieren in app.js wie App.variable = Wert; und importieren Sie es überall, aber verwenden Sie es nicht für größere Mengen –