2013-06-26 3 views
5

Sto utilizzando BackboneJS con RequireJS per un'applicazione che sto creando.Variabile globale in un router BackboneJS utilizzando RequireJS

Un file App inizializza il Router:

// Define application router 
var router = new AppRouter(); 
Backbone.history.start(); 

E poi il router prende il controllo di azioni di sistema.

var App = Backbone.Router.extend({ 

    routes: { 

     "project/:id": "getProject", 
     "projects": "getProjects", 
     "*actions": "defaultRoute" 
    }, 

    getProject: function (id) { 
     // dashboard.set('some_key', 'some_value'); 
    }, 

    getProjects: function() { 
     // dashboard.set('some_key', 'some_value'); 
    }, 

    defaultRoute: function() { 
     // dashboard.set('some_key', 'some_value'); 
    } 

}); 

Ho aggiunto un modello Dashboard e vista che uso per visualizzare le informazioni sullo stato globale del mio sistema in un dato momento. (Questo siederà in cima alla finestra). La sua vista monitora il suo modello per la modifica dei valori e il re-rendering quando necessario. Funziona bene

Voglio evitare di dover riscrivere questo mai dopo il mio esemplificazione oggetto iniziale:

var dashboard = new DashboardModel(); 
var dashboardView = new DashboardView({ model: dashboard }); 
$('#dashboard-placeholder').html(dashboardView.render().el); 

Che cosa ho bisogno, però, è quello di essere in grado di accedere a questo oggetto ovunque (un'istanza della mia Dashboard modello). Al momento l'ho inizializzato in App ma non posso accedervi nel router se faccio questo. Non voglio veramente definirlo nel router perché non sembra il compito giusto da eseguire per il router.

Come e dove definisco questa istanza del mio modello Dashboard?

risposta

13

Che cosa ho bisogno, però, è quello di essere in grado di accedere a questo oggetto ovunque

Quello che state cercando è la singleton pattern:

Intent:

  • Assicurarsi che viene creata solo un'istanza di una classe.
  • Fornire un punto globale di accesso all'oggetto.

Attuazione:

  • (...) Il pattern Singleton definisce un'operazione getInstance che espone l'istanza ique un cui si accede dai clienti. getInstance() è responsabile della creazione dell'istanza univoca della classe nel caso in cui non sia ancora stata creata e per restituire tale istanza.

Ed è così che si potrebbe implementarlo:

define("DashboardModel", function() { 
    var instance; 

    var DashboardModel = Backbone.Model.extend({ 
     (...) 
    }); 

    // Static method 
    DashboardModel.getInstance = function() { 
     // "instance" can be "this.instance" (static property) 
     // but it is better if it is private 
     if (!instance) { 
      instance = new DashboardModel(); 
     } 
     return instance; 
    }; 
}); 

Ora ogni volta che è necessario l'istanza DashboardModel si solo bisogno di chiamare:

var DashboardModel = require("DashboardModel"); //or from the define arguments 
var dashboard = DashboardModel.getInstance(); 
+0

risposta brillante, grazie mille. Avevo in mente un approccio singleton, ma non ero ancora sicuro di come creare un metodo statico! Ha funzionato alla grande, grazie. – Alex