Глобальная переменная в маршрутизаторе BackboneJS с использованием RequireJS

Я использую BackboneJS с RequireJS для приложения, которое я создаю.

Файл App инициализирует маршрутизатор:

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

И тогда Маршрутизатор берет на себя управление действиями системы.

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

});

Я добавил модель Dashboard и представление, которое я использую для отображения глобальной информации о состоянии моей системы в любой момент времени. (Это будет находиться в верхней части окна). Его представление отслеживает свою модель на предмет изменения значений и при необходимости выполняет повторный рендеринг. Это прекрасно работает.

Я хочу избежать необходимости переписывать это всегда после инициализации моего первоначального объекта:

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

Что мне нужно, так это иметь доступ к этому объекту в любом месте (экземпляр моей модели Dashboard). На данный момент я инициализирую его в App, но я не могу получить к нему доступ в маршрутизаторе, если я это сделаю. Я действительно не хочу определять его В маршрутизаторе, потому что это не похоже на правильную задачу для маршрутизатора.

Как и где определить этот экземпляр моей модели Dashboard?


person Alex    schedule 26.06.2013    source источник


Ответы (2)


Что мне нужно, так это иметь доступ к этому объекту в любом месте

Вам нужен шаблон-одиночка:

Намерение:

  • Убедитесь, что создан только один экземпляр класса.
  • Обеспечить глобальную точку доступа к объекту.

Реализация:

  • (...) Шаблон Singleton определяет операцию getInstance, которая предоставляет уникальный экземпляр, к которому обращаются клиенты. getInstance() отвечает за создание уникального экземпляра своего класса, если он еще не создан, и за возврат этого экземпляра.

И вот как вы можете это реализовать:

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

Теперь каждый раз, когда вам нужен экземпляр DashboardModel, вам нужно всего лишь вызвать:

var DashboardModel = require("DashboardModel"); //or from the define arguments
var dashboard = DashboardModel.getInstance();
person Kaizo    schedule 26.06.2013
comment
Блестящий ответ, большое спасибо. Я имел в виду одноэлементный подход, но все еще не знал, как создать статический метод! Отлично сработало, спасибо. - person Alex; 26.06.2013

Синглтон — очевидный выбор, но я думаю, что вы также можете создать экземпляр своей модели в новом определении модуля.

define("MyX", "MyXModel", function(MyXModel){
    return new MyXModel();
});

См. документацию AMDjs API https://github.com/amdjs/amdjs-api/wiki/AMD#factory-

person pawciobiel    schedule 20.04.2014