我得到了以下 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
让我们看看我如何解决这个问题
UPDATE2: 我现在将路由器事件绑定部分包装到一个 setTimeout 循环中:
setTimeout(function() {
window.router.on('route:settings', this.select, this);
}.bind(this), 20);
看看它的工作原理!
这确实只是一个修复,但仍然是一个修复:)