次の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;
});
ルーターは、requirejs 構成で最初の依存関係としてマークされている main.js ファイルで呼び出されます。
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);
そして、それが機能することを確認してください!
これは本当に単なる修正ですが、それでも修正です:)