2016-01-05 4 views
0

Serait génial de voir un exemple de la façon d'ajouter un observateur à la propriété de données de service de session d'auth.Exemple d'un simple session session.addObserver pour un membre?

Je suis actuellement coincé sur un autre problème mais j'y reviendrai bientôt.

Actuellement, j'ai écrit ceci dans mon application/route.js, mais je suis bloqué sur un autre problème, donc je ne sais pas si c'est correct. Je ne sais même pas si la route d'application est le meilleur endroit pour mettre cet observateur, et encore moins dans le hook beforeModel.

export default Ember.Route.extend({ //adds in login/logout actions 
    session: Ember.inject.service('session'), 
    //I also tried putting this code in a model() hook, still no luck. 
    beforeModel() { 
    this.get('session').addObserver('data', (sender, key, value, rev) => { 
     console.log('session data addObserver fired with these arguments:', sender, key, value, rev) 
    }) 
    }, 
    actions: { 
    error: function(error, transition) { 
     console.error('ApplicationRoute error action', arguments) 
     // substate implementation when returning `true` 
     return true; 
    } 
    } 
}).extend(ApplicationRouteMixin) 

Note: J'utilise une version non documentée de l'api service.addObserver, peut obtenir peu mais je présenté une demande de traction à ce sujet: https://github.com/emberjs/ember.js/pull/12768

+0

Quel est le cas d'utilisation pour cela? Vous voulez que l'observateur soit déclenché chaque fois que quelque chose change dans les données de la session? – marcoow

+0

Oui, suivez toutes les modifications apportées aux données de session. –

Répondre

0

Ce code est 99% là. La chose qui me manquait était que je devrais ajouter des Observers pour chaque data.key, et pas seulement data, que je veux suivre. Voici mon code final dans ma route d'application:

var sentData = {} 
var sendToExtension = (service, key, value, rev/*ignored*/) => { 
    if (value != null) console.log('value actually is defined for once!', value, 'rev:', rev) 
    // It seems value is always undefined. Here we check if it's undefined or null and if 
    if (value == null && service.get(key) != null) value = service.get(key) 
    if (sentData[key] != null && sentData[key] === value) { 
    console.log('already sent '+key+': '+value+', returning') 
    return 
    } 
    sentData[key] = value 
    //proceed however you want with the knowledge that the `key` has just been set to this `value 
} 

var haveRegisteredSessionObservers = false 
export default Ember.Route.extend({ //adds in login/logout actions 
    session: Ember.inject.service('session'), 
    beforeModel() { 
    //if we're in chrome, add session data observer to send the session data back to the extension background page 
    if (window.chrome && !haveRegisteredSessionObservers) { 
     applicationRouteInstance = this 
     ;['data.email', 'data.user_id', 'isAuthenticated'].forEach((key) => { 
     this.get('session').addObserver(key, sendToExtension) 
     }) 
     haveRegisteredSessionObservers = true