2016-06-02 7 views
1

Ich lade gerade einige Glut-Daten, die Site-weit von der Route routes/application.js verwendet werden. Auf diese Daten kann dann überall zugegriffen werden. Insbesondere werden die Daten von der Vorlage templates/application.hbs an eine Komponente übergeben und von einer Vielzahl anderer Stellen aus auf store.peekAll() zugegriffen.Ember-Datenmodelle, die in application.js geladen werden, laden nicht nach ember-simple-auth Authentifizierung

Ob dies der richtige Ansatz ist oder nicht (! Und ich begrüße Feedback auf dem), das funktioniert für mich, außer im folgenden Fall:

Wenn der Benutzer nicht authentifiziert ist, kann ich nicht abfragen für die Daten, weil sie noch nicht zur Ansicht berechtigt sind. Dies ist der Code, den ich habe:

// routes/application.js 
import Ember from 'ember'; 

export default Ember.Route.extend(ApplicationRouteMixin, { 
    model() { 
    if (this.get('session.isAuthenticated')) { 
     return Ember.RSVP.hash({ 
     clients: this.store.findAll('client', {include: 'projects'}), 
     resources: this.store.findAll('resource') 
     }); 
    } 
    } 
}); 

Ich mag würde die Datenlast machen, nachdem sie authentifizieren, aber ich weiß nicht, wie das Modell neu laden zu machen. Wenn ich nur die Datenlast im sessionAuthenticated Haken haben, wie folgt:

// routes/application.js 
sessionAuthenticated() { 
    this.controller.set('clients', this.store.findAll('client', {include: 'projects'})); 
    this._super(...arguments); 
} 

Es funktioniert nicht. Die store wird mit den Daten gefüllt, aber die Komponenten, die von diesen Daten abhängig sind, sehen sie nie. Auch die Route, auf die ich als nächstes übergehe, was auch von den Daten abhängt, hat es aufgrund der Synchronizität nicht rechtzeitig.

Es muss einen einfachen Weg, dies zu tun, aber ich bin verwirrt, was es ist. Beobachter? Erzwingen, dass die Methode routes/application.jsmodel() erneut ausgeführt wird (und warten, bis die Zusage zurückkommt), jetzt session.isAuthenticated ist true?

ember: 2.5.x, glut-Daten: 2.5.x

+1

Wie Sie bereits wissen, das Problem ist, dass Sie tun dies auf die Anwendung Route. Haben Sie darüber nachgedacht, diese Modelle aus einem ** Service ** anzubieten? Injizieren Sie den Dienst in die Routen, die Zugriff auf Clients/Ressourcen benötigen. –

+1

Das klingt nach dem richtigen Ansatz. Ich werde es nicht bis nächste Woche versuchen können, aber ich melde mich hier zurück! – pauldoerwald

+0

Dieser Ansatz war größtenteils erfolgreich; Ich habe eine [Folgefrage] (http://stackoverflow.com/questions/37756214/accessing-a-services-promise-from-a-route) gepostet, von der ich hoffe, dass sie den Rest des Weges beantwortet. In der Zwischenzeit werde ich diese Frage beantworten mit dem, was mir eingefallen ist. – pauldoerwald

Antwort

1

ich den Dienst wie folgt umgesetzt:

// services/lime-core.js 
import Ember from 'ember'; 

export default Ember.Service.extend({ 
    store: Ember.inject.service(), 
    resources: null, 
    clients: null, 

    init() { 
    this.set('resources', []); 
    this.set('clients', []); 

    this.get('store').findAll('resource').then(resources => { 
     this.set('resources', resources); 
    }); 
    this.get('store').findAll('client', {include: 'projects'}).then(clients => { 
     this.set('clients', clients); 
    }); 
    } 
}); 

ich dann in der Lage war, Greifen Sie auf den Service limeCore in Vorlagen zu, vorausgesetzt, er wurde injiziert:

// components/foo/component.js 
export Ember.Component.extend({ 
    limeCore: Ember.Service.inject(), 
    ... 
} 

und meine Vorlage:

// components/foo/template.hbs 
<ul> 
    {{#each limeCore.resources as |resource|}} 
    <li>{{resource.name}}</li> 
    {{/each}} 
</ul> 
0

Try this:

// routes/application.js 
import Ember from 'ember'; 

export default Ember.Route.extend(ApplicationRouteMixin, { 
    model() { 
    if (this.get('session.isAuthenticated')) { 
     return Ember.RSVP.hash({ 
     clients: this.store.findAll('client', {include: 'projects'}), 
     resources: this.store.findAll('resource') 
     }); 
    } 
    return {}; 
    }, 
    sessionAuthenticated() { 
    this.store.findAll('client', {include: 'projects'}).then(clients => { 
     this.controller.set('model.clients', clients); 
    }); 

    this._super(...arguments); 
    } 
}); 
+0

Das hat tatsächlich nicht funktioniert. Ich denke, dass die Abfrage synchron erfolgen muss, zumindest bei diesem Ansatz. Ich werde den oben beschriebenen Service-Ansatz versuchen. – pauldoerwald