2012-05-29 8 views
7

Chcę utworzyć model UserSession, który ładuje i zapisuje identyfikator sesji do pliku cookie za pomocą wtyczki cookie jQuery.Wymagaj Js szkieletowych modeli globalnych JS

To jest mój kod dla mojego modułu modelu 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; 
}); 

Ale powiedzmy, że chcę, aby uzyskać dostęp do mojego logowania widzenia:

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; 
}); 

Rzecz jest za każdym razem uzyskać dostęp do UserSession model w modułach (zobacz funkcję success call back) używa wartości domyślnych, więc muszę mieć jakieś pojedyncze wystąpienie modelu UserSession, jak mogę to zrobić?

Moim pierwszym pomysłem było wykorzystanie przestrzeni nazw aplikacji, więc w naszym main.js (pierwszy główny moduł, który zostanie załadowany) i tam zainicjować moduł UserSession, i za każdym razem, gdy inny moduł uzyskuje dostęp do tego modułu, wymaga modułu głównego, który ma obiekt, który zwraca instancję UserSession.

Jak to zrobić najlepiej?

Dzięki

+0

Twój pierwszy pomysł wydaje się idealnym rozwiązaniem. W przeciwnym razie musisz przechowywać sesję użytkownika w localStorage/cookies i takie rzeczy ... –

+0

Jak wygenerować sesję na serwerze i uzyskać do niej dostęp? Chcę użyć tego samego podejścia, ale mam problemy z dostępem do zawartości plików cookie. Nie mam widoku logowania, ponieważ jest on renderowany przez serwer. – Gambo

Odpowiedz

21

Zakładając chcesz pojedynczej globalnej UserSession całej swojej aplikacji, chciałbym tylko zwrócić instancję UserSession z modułu UserSession. W ten sposób odzyskasz ten sam obiekt za każdym razem, gdy użyjesz UserSession w wywołaniu definicji. Na przykład

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

    return new UserSession(); 
}); 

wtedy gdzie indziej:

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

Require.js powinien działać tylko moduł UserSession raz, niezależnie od tego, ile razy jest używany w innym miejscu, więc obiekt UserSession ty wystąpienia tam jest faktycznie Singleton .

+3

Można również rozdzielić je na dwa osobne pliki: UserSession i UserSessionSingleton. Może to uczynić jaśniejszym, jeśli otrzymujesz instancję lub konstruktor od instrukcji require. –

Powiązane problemy