同じ MVC アプリケーションに複数のシングルページ アプリがあります。Backbone/Marionette を使用していますが、ルーティングが機能していないようです (デフォルトの Route アクションは起動されません)。
コード:
QaApp.module("QaApp", function (Mod, App, Backbone, Marionette, $, _) { QaApp.Router = Marionette.AppRouter.extend( { appRoutes: { '' : 'subscribe', ':id': 'subscribe', '/qa/index/:id': 'subscribe' } }); var Api = { subscribe: function (id) { //never fires console.log("subscribing with id = " + id); QaApp.Lightstreamer.Do('subscribeUpdate', { adapterName: 'QaAdapter', field: ['jsonString', 'firstData'], parameterValue: id, onUpdate: load }); }, load: function (data) { var question = new QaApp.Question({ id: data.id, collection: data.messages }); var questionView = new QaApp.QuestionView(question); QaApp.page.show(questionView); } }; QaApp.addInitializer(function () { var router = new QaApp.Router( { controller: Api }); console.log(router.appRoutes); }); });
標準ルーターは、ルート URL が であるhttp://localhost
か、そうでない場合、ルートは # の後のものであると想定しているようです (いずれにせよ、適切なドキュメントが見つかりません)。
そのため、ページにアクセスしたときの URL は次のようになります。
http://localhost/qa/index/1
ここで、コントローラーは「qa」、ビューは「index」、id は 1 です。
「購読」アクションをこのデフォルトの URL で起動し、「id」をパラメーターとして取得する必要があります。
どのルートを使用すればよいですか?
注:この投稿に従って、初期化子の実行後に Backbone.history.start() が呼び出されることを確認しました。
また、注: appRoutes の下には、私が試したすべての異なるルートがあります。正しいものを見つけることができれば、1つしか必要ないことはわかっています。
前もって感謝します!
更新: バックボーン コードをステップ実行すると、「this.handlers」が空の配列であるように見えるため、URL が一致しないようです。
更新された回答に基づく更新: ルートを渡すと、バックボーンはルートにいることを認識できるようになるため、はるかに近くなりますが、次のセグメントでは、「フラグメント」は「」であり、this.handlers は長さ 0 の配列です。 、および「一致」は false を返します。
loadUrl: function (fragmentOverride) {
var fragment = this.fragment = this.getFragment(fragmentOverride);
var matched = _.any(this.handlers, function (handler) {
if (handler.route.test(fragment)) {
handler.callback(fragment);
return true;
}
});
return matched;
}
最終更新: ハンドラーが空であることが問題でした。これは、backbone.js の 2 番目のインスタンスをロードするページのパーシャルが原因であることが判明しました。そのため、1 つのインスタンスにはハンドラーが設定され、もう 1 つのインスタンスには設定されていませんでした。
ありがとう、デビッド!