2013-06-02 27 views
23

Ho bisogno di utilizzare una variabile globale (contesto utente, disponibile da tutto il codice) Ho letto alcuni post su questo argomento ma non ho una risposta chiara.Accesso a una variabile globale da qualsiasi controller di app

App = Ember.Application.create({ 
    LOG_TRANSITIONS: true, 
    currentUser: null 
}); 
  1. E 'una buona pratica per impostare la variabile globale currentUser nell'oggetto App?
  2. Come aggiornare e accedere alla proprietà currentUser da tutti i controller utilizzati nell'app?

risposta

58

È buona norma impostare la variabile globale Utente corrente nell'oggetto App?

No, questa non è una buona pratica. Dovresti evitare di usare variabili globali. Il framework fa molto per renderlo possibile - se ti accorgi che pensare a una variabile globale è la soluzione migliore, è un segno che qualcosa dovrebbe essere rifattorizzato. Nella maggior parte dei casi il posto giusto è in un controller. Ad esempio, potrebbe essere currentUser:

//a property of application controller 
App.ApplicationController = Ember.Controller.extend({ 
    currentUser: null 
}); 

//or it's own controller 
App.CurrentUserController = Ember.ObjectController.extend({}); 

Come aggiornare e accedere alla proprietà currentUser da tutti i controllori utilizzati in app?

Utilizzare la proprietà needs. Supponiamo che tu abbia dichiarato currentUser come proprietà di ApplicationController. Vi si può accedere da PostsController come questo:

App.PostsController = Ember.ArrayController.extend{(
    needs: ['application'], 
    currentUser: Ember.computed.alias('controllers.application.currentUser'), 
    addPost: function() { 
    console.log('Adding a post for ', this.get('currentUser.name')); 
    } 
)} 

Se avete bisogno di accedere currentUser da una vista/template, basta usare needs per renderlo accessibile tramite il controllore locale. E se ne hai bisogno da una rotta, usa il metodo di controllo del percorso.

+0

Ho poche proprietà booleane a livello di applicazione e tali proprietà verranno utilizzate in quasi tutte le viste/modelli. Se li definisco in 'applicationController', devo definire la proprietà' needs' in tutto il controller. Se li definisco in App, non c'è bisogno di "bisogni". Qualche idea su questo? – Manoharan

+1

Riesco a vedere un argomento per l'impostazione di alcune proprietà booleane a livello di app, come la stessa ember definisce LOG_TRANSITIONS. Qualcosa di più complicato dovrebbe essere nel proprio controller. Se ti trovi in ​​una situazione in cui desideri che un controller sia disponibile in tutti gli altri, puoi utilizzare un inizializzatore per iniettarlo negli altri. Vedi http://mcdowall.info/posts/ember-application-initializers/ per un esempio che rende 'CurrentUserController' disponibile come proprietà' currentUser' di tutti i controller. Potrebbe facilmente fare lo stesso con un ConfigController. –

+1

Ember.Computed dovrebbe essere Ember.computed – Nath

Problemi correlati