2012-05-29 16 views
7

Deseo crear un modelo de UserSession, que carga y guarda el ID de sesión en una cookie utilizando el complemento de cookie jQuery.Requerir js backbone JS global models

Este es mi código para mi módulo de modelo 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; 
}); 

Pero le digo que quiero acceder a él en mi punto de vista entrada:

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 está cada vez que se accede al UserSession model in modules (ver la función de devolución de llamada model.save success) usa valores predeterminados, así que necesito tener algún tipo de instancia singleton del modelo UserSession, ¿cómo puedo hacer esto?

Mi primera idea fue usar el espacio de nombres de la aplicación en nuestro main.js (primer módulo principal que se carga) e inicializar el módulo UserSession, y cada vez que otro módulo accede a ese módulo, requiere el módulo principal que tiene un objeto que devuelve la instancia de UserSession.

¿Cómo se puede hacer esto mejor?

Gracias

+0

Su primera idea parece ser la solución perfecta. De lo contrario, tendría que almacenar la sesión de usuario en localStorage/cookies y cosas así ... –

+0

¿cómo se genera la sesión en el servidor y se accede a ella? Quiero utilizar el mismo enfoque pero tengo problemas para acceder al contenido de la cookie. No tengo una vista de inicio de sesión ya que el servidor la muestra. – Gambo

Respuesta

21

Suponiendo que desea un solo UserSession global a través de toda su aplicación, sólo quiero devolver un UserSession instancia del módulo UserSession. De esta forma, obtendrá el mismo objeto cuando use UserSession en una llamada de definición. Por ejemplo

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

    return new UserSession(); 
}); 

Luego en otra parte:

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

Require.js sólo debe ejecutar el módulo UserSession vez independientemente del número de veces que se utiliza en otros lugares, por lo que el objeto UserSession se ejemplariza en que hay efectivamente un producto único .

+3

También puede separarlos en dos archivos separados, UserSession y UserSessionSingleton. Esto podría aclararlo si obtiene la instancia o el constructor de la declaración require. –

Cuestiones relacionadas