Я получил следующий router.js:
define(['jquery', 'underscore', 'backbone', 'views/settings/index'], function($, _, Backbone, SettingsView) {
var Router = Backbone.Router.extend({
container: $('div.main'),
routes: {
"settings": "settings"
, "settings/:query": "settings"
},
settings: function(query) {
this.container.html(SettingsView.render().el);
}
});
if (Router._instance) return Router._instance;
Router._instance = new Router();
return Router._instance;
});
Маршрутизатор вызывается в файле main.js, который помечен как первая зависимость в конфигурации requirejs:
define(['jquery', 'underscore', 'backbone', 'router'], function($, _, Backbone, router) {
// ajax settings (sent cors cookies)
$.ajaxSetup({ xhrFields: { withCredentials: true } });
// register master router
window.router = router;
// start backbone history
Backbone.history.start({ root: "/" });
});
В некотором смысле я теперь хочу сделать:
define(['jquery', 'underscore', 'backbone', 'router'], function($, _, Backbone, router) {
var View = Backbone.View.extend({
initialize: function() {
router.on('route:settings', this.change, this);
},
change: function(query) {
// load some new content for example
}
});
return View;
});
Чем я получаю это сообщение об ошибке:
Uncaught TypeError: Cannot call method 'on' of undefined
ОБНОВЛЕНИЕ: я добавил console.log в каждый модуль. Так что я знаю, в каком порядке выполняются модули. Я упомянул, что у requirejs неправильный порядок:
view.js -> main.js -> router.js
вместо:
router.js -> main.js -> view.js
Посмотрим, как я могу это решить
ОБНОВЛЕНИЕ 2: теперь я завернул часть привязки событий маршрутизатора в цикл setTimeout:
setTimeout(function() {
window.router.on('route:settings', this.select, this);
}.bind(this), 20);
И посмотрите, как это работает!
Это действительно просто исправление, но, тем не менее, исправление :)