2012-05-29 1 views
7

Voglio creare un modello UserSession, che carica e salva l'ID di sessione in un cookie utilizzando il plugin jQuery.Richiedi js backbone JS global models

Questo è il mio codice per il mio modulo modello UserSession:

define(['jQuery', 'Underscore', 'Backbone'], 
function($, _, Backbone){ 

    var UserSession = Backbone.Model.extend({ 
     defaults: { 
      'accessToken': null, 
      'userId': null 
     }, 
     initialize: function(){ 
      this.load(); 
     }, 
     authenticated: function(){ 
      return Boolean(this.get('accessToken')); 
     }, 
     save: function(authHash){ 
      $.cookie('userId', authHash.id); 
      $.cookie('accessToken', authHash.accessToken); 
     }, 
     load: function(){ 
      this.userId = $.cookie('userId'); 
      this.accessToken = $.cookie('accessToken'); 
     } 
    }) 

    return UserSession; 
}); 

Ma Diciamo che voglio per accedere nel mio vista login:

define(['jQuery', 'Underscore', 'Backbone', 'text!templates/login.html', 'models/UserLogin', 'models/UserSession'], 
function($, _, Backbone, loginTemplate, UserLogin, UserSession){ 

    var LoginView = Backbone.View.extend({ 
     model: new UserLogin, 
     el: $('#screen'), 
     events: { 
      'submit #frm-login': 'login' 
     }, 
     login: function(e){ 
      e.preventDefault(); // Lets not actually submit. 

      this.model.set({ 
       'username': $('#login-username').val(), 
       'password': $('#login-password').val() 
      }); 

      this.model.save(null, { 
       success: function(nextModel, response){ 
        // Do something here with UserSession model 
       }, 
       error: function(){ 
       } 
      }); 
     }, 

     render: function(){ 
      $(this.el).html(_.template(loginTemplate, {})); 
      return this; 
     } 
    }); 

    return new LoginView; 
}); 

La cosa è ogni volta che accedo al UserSession modello nei moduli (si veda la funzione di richiamo del modello success.save) usa i valori predefiniti, quindi ho bisogno di avere qualche tipo di istanza singleton del modello UserSession, come posso fare questo?

La mia prima idea era di usare lo spazio dei nomi dell'app così nel nostro main.js (il primo modulo principale che viene caricato) e lì inizializzare il modulo UserSession, e ogni volta che un altro modulo accede a quel modulo, richiede il modulo principale che ha un oggetto che restituisce l'istanza UserSession.

Come può essere fatto al meglio?

Grazie

+0

La tua prima idea sembra essere la soluzione perfetta. Altrimenti, dovresti memorizzare la sessione utente in localStorage/cookies e cose del genere ... –

+0

come si genera la sessione sul server e ad accedervi? Voglio utilizzare lo stesso approccio, ma ho problemi ad accedere al contenuto dei cookie. Non ho una vista di accesso come questo è reso dal server. – Gambo

risposta

21

Supponendo che si desidera un singolo UserSession globale in tutta l'intera applicazione, vorrei solo restituire un UserSession istanziato dal modulo UserSession. In questo modo otterrai lo stesso oggetto ogni volta che utilizzi UserSession in una chiamata di definizione. Per esempio

define(['jQuery', 'Underscore', 'Backbone'], 
function($, _, Backbone){ 
    var UserSession = Backbone.View.extend({ ... }); 

    return new UserSession(); 
}); 

Poi altrove:

define(['UserSession'], 
function(UserSession){ 
    // UserSession in here will be the singleton you created in the UserSession module 
    alert(UserSession.authenticated()); 
}); 

Require.js dovrebbe eseguire solo il modulo UserSession una volta indipendentemente dal numero di volte che viene utilizzato altrove, quindi l'oggetto UserSession si crea un'istanza in là è effettivamente un Singleton .

+3

È anche possibile separarli in due file separati, UserSession e UserSessionSingleton. Questo potrebbe renderlo più chiaro se stai ottenendo l'istanza o il costruttore dall'istruzione require. –