2015-08-20 2 views
0

J'ai un problème avec le brai lorsque je souhaite utiliser une donnée de session (companyId affectée à un utilisateur) dans un modèle. J'utilise ember-cli et ember 0.13.1 avec ember-simple-auth. Disons que j'ai un itinéraire appelé utilisateur/profil lorsque je veux afficher des informations sur la société à laquelle l'utilisateur est assigné. Pour ce faire, je dois récupérer un ID de société affecté à un utilisateur depuis une session et passer un appel avec un modèle dans mon API. Actuellement la route pour l'utilisateur/profil ressemble que:Modèle Ember avec des données de session

import Ember from 'ember'; 
import AuthenticatedRouteMixin from 'simple-auth/mixins/authenticated-route-mixin'; 

export default Ember.Route.extend(AuthenticatedRouteMixin, { 
    model: function() { 
     return Ember.RSVP.hash({ 
       industries: this.store.findAll('industry'), 
       industryroles: this.store.findAll('industryrole'), 
       company: this.store.find('company',this.session.get('user.companyId')) 
     }); 
    }, 
    setupController: function(controller, model) { 
     controller.set('industries', model.industries); 
      controller.set('industryroles', model.industryroles); 
     controller.set('company', model.company); 
    } 
}); 

Tout fonctionne quand vous allez à cet itinéraire de route différente, mais quand vous êtes utilisateur/route profil et que vous appuyez sur F5 puis la this.session.get ('user.companyId') est indéfini.

Est-ce que quelqu'un a une idée de comment je peux résoudre ce problème?

Meilleures salutations Pawel

+0

Si l'utilisateur peut avoir accès uniquement à leur entreprise, vous pouvez résoudre cela sur le backend: déterminer quel utilisateur demande des informations et retourner leur entreprise. –

+0

Merci pour votre réponse, mais je ne veux pas le faire dans mon backend parce que j'utilise la même demande également dans d'autres routes. Je me demande si je devrais injecter la session sur un modèle, mais j'ai trouvé dans le forum simple-auth que ce n'est pas la manière suggérée de le faire. Une autre chose est que j'inscris un utilisateur avec une promesse, ce qui signifie que les modèles de l'utilisateur/profil route s'exécuteront après que cette promesse soit résolue. – owenek1

Répondre

0

Il est vous semble besoin de regarder dans un cadre session.content (si vous ne remplaçant crochet beforeModel dans l'utilisateur/route profil, bien sûr). S'il y a deux étapes de récupération de données dans votre cas, vous devez attendre les données de session dans le crochet du modèle utilisateur/profil, et seulement ensuite vous pouvez obtenir user.companyId.

+0

J'ai posté ma solution, mais cela ne fonctionne pas correctement. Je n'ai pas trouvé de solution pour attendre que la session soit définie dans beforeModel. Pourriez-vous me donner un exemple comment puis-je faire cela? Merci! – owenek1

0

J'ai trouvé une solution. J'ai mis un observateur pour session.user.companyId dans la route de l'utilisateur/profil. Donc, actuellement mon itinéraire ressemble à ça:

//app/routes/user/profile.js 
import Ember from 'ember'; 
import AuthenticatedRouteMixin from 'simple-auth/mixins/authenticated-route-mixin'; 

export default Ember.Route.extend(AuthenticatedRouteMixin, { 
    onSessionIsAuthenticated: function() { 
    var isAuthenticated = this.get('session.isAuthenticated'); 
    if (!isAuthenticated) { 
     return false; 
    } 
     var _this = this; 
    return Ember.RSVP.hash({ 
     company: _this.store.find('company',this.get('session.user.companyId')).then(function (data) { 
     _this.controllerFor('user.profile').set('company', data); 
     }) 
    }); 
    }.observes('session.user.companyId'), 
    model: function() { 
     return Ember.RSVP.hash({ 
       industries: this.store.findAll('industry'), 
       industryroles: this.store.findAll('industryrole') 
     }); 
    }, 
    setupController: function(controller, model) { 
     controller.set('industries', model.industries); 
      controller.set('industryroles', model.industryroles); 
    } 
}); 

L'industrie de repos et les rôles de l'industrie sont encore présents dans un contrôleur. Maintenant tout semble correct mais je ne suis pas sûr si c'est la bonne solution pour ce problème. Je ne suis pas sûr si c'est ce que vous étiez dans votre esprit @Microfed?

0

Si quelqu'un est toujours aux prises avec le problème décrit ci-dessus. C'est la solution:

import Ember from 'ember'; 
import AuthenticatedRouteMixin from 'simple-auth/mixins/authenticated-route-mixin'; 

export default Ember.Route.extend(AuthenticatedRouteMixin, { 
    model: function() { 
     return Ember.RSVP.hash({ 
       industries: this.store.findAll('industry'), 
       industryroles: this.store.findAll('industryrole'), 
       company: this.store.find('company', this.get('session.data.user.companyId')) 
     }); 
    }, 
    setupController: function(controller, model) { 
     controller.set('industries', model.industries); 
      controller.set('industryroles', model.industryroles); 
     controller.set('company', model.company); 
    } 
}); 
+0

Suggestion: essayez 'controller.setProperties (model)' au lieu de le définir individuellement. – kumkanillam