2013-06-26 10 views
5

Używam BackboneJS z RequireJS dla aplikacji, którą buduję.Zmienna globalna w routerze BackboneJS przy użyciu RequireJS

Plik App inicjuje Router:

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

A potem router przejmuje kontrolę nad działaniami systemowymi.

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

}); 

Dodałem Dashboard modelu i widoku, które mogę używać do wyświetlania globalnych informacji o stanie mojego systemu w danym momencie. (To będzie siedzieć u góry okna). Jego widok monitoruje model zmiany wartości i ponownego renderowania w razie potrzeby. To działa dobrze.

chcę uniknąć konieczności ponownego napisania tego kiedykolwiek po moim początkowym wystąpienia obiektu:

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

Co potrzebne jest jednak to, aby być w stanie uzyskać dostęp do tego obiektu w dowolnym miejscu (wystąpienie mojego Dashboard Model). W tej chwili uruchamiam go w App, ale nie mogę uzyskać do niego dostępu w routerze, jeśli to zrobię. Naprawdę nie chcę tego definiować w routerze, ponieważ nie jest to właściwe zadanie dla routera.

Jak i gdzie mogę zdefiniować to wystąpienie mojego modelu Dashboard?

Odpowiedz

13

Co potrzebne jest jednak to, aby być w stanie uzyskać dostęp do tego obiektu nigdzie

Co szukasz jest singleton pattern:

zamiar:

  • Upewnić że tworzone jest tylko jedno wystąpienie klasy.
  • Udostępnienie globalnego punktu dostępu do obiektu.

Realizacja:

  • (...) Jak Singleton getInstance określa operację, która odsłania un ique instancji, który jest używany przez klientów. getInstance() to odpowiedzialna za stworzenie unikalnej instancji klasy w przypadku, gdy nie jest jeszcze utworzona i zwrócenie tej instancji.

A to w jaki sposób można go realizować:

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

Teraz za każdym razem trzeba instancję DashboardModel tylko trzeba zadzwonić:

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

Brilliant odpowiedź, dziękuję bardzo. Miałem na myśli podejście singleton, ale wciąż nie byłem pewien, jak zrobić statyczną metodę! Świetnie się spisałam, dziękuję. – Alex