バックボーンjsでこのようなことを達成しようとしています
var AppRouter = Backbone.Router.extend({
routes: {
// MVC like route
':controller': 'defaultRoute',
// MVC like route
':controller/:action': 'defaultRoute',
// MVC like route
':controller/:action/:id': 'defaultRoute',
// MVC like route
':controller/:action/*id': 'defaultRoute'
},
defaultRoute: function (controller, action, id) {
// render view here or
// call another specific route regarding to controller parameter
}
});
var appRouter = new AppRouter;
Backbone.history.start();
したがって、url が次の場合: something.com/#home/index defaultRoute 関数は、パラメーターcontroller="home"およびaction="index"を取得します。フォルダー「コントローラー/ホーム/インデックス」でビュー(Backbone.View)を見つけて動的にインスタンス化する(およびレンダリングする)方法を今疑問に思っています。また、「コントローラー」ごとに Backbone.Router を使用する方がよいのではないかと考えています (「コントローラー」という名前を使用していますが、実際には「ルーター」です)。
何か案は?
可能な解決策で更新してください!
私はこれで終わった
// Filename: router.js
define([
'jquery',
'underscore',
'backbone'
], function ($, _, Backbone) {
var AppRouter = Backbone.Router.extend({
routes: {
// MVC like route
':controller': 'defaultRoute',
// MVC like route
':controller/:action': 'defaultRoute',
// MVC like route
':controller/:action/:id': 'defaultRoute',
// MVC like route
':controller/:action/*id': 'defaultRoute'
},
defaultRoute: function (controllerName, actionName, id) {
controllerName = controllerName || Config.Defaults.Controller;
actionName = actionName || Config.Defaults.Action;
require(["controllers/" + controllerName], function (ctl) {
var code = "ctl." + actionName + "();";
eval(code);
});
}
});
var appRouter = new AppRouter;
Backbone.history.start();
});
そしてサンプルコントローラーはこれ
define([
'jquery',
'underscore',
'backbone'
], function ($, _, Backbone) {
return {
index: function () {
console.log("Action: Index");
},
about: function () {
console.log("Action: About");
}
};
});
このサンプルで動作します。現在、params バインディングなどを解決しようとしています。さらにテストが必要です。