Глобална променлива в 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 модел и изглед, които използвам за показване на глобална информация за състоянието на моята система във всеки един момент. (Това ще се намира в горната част на прозореца). Неговият изглед следи модела си за промяна на стойностите и повторно изобразяване, когато е необходимо. Това работи добре.

Искам да избегна необходимостта да пренаписвам това ever след първоначалното ми създаване на обект:

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

Singleton е очевиден избор, но мисля, че можете също да създадете екземпляр на вашия модел в нова дефиниция на модул.

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