0

同じ 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 つのインスタンスには設定されていませんでした。

ありがとう、デビッド!

4

1 に答える 1

5

URL に「#」を含めたくない場合は、pushState を使用する必要があります

Backbone.history.start({pushState: true });

これが機能するには、バックボーン アプリケーションが生成できる各 URL がサーバー上に存在する必要があることに注意してください。つまり、サーバーは、アクセスできる URL ごとに有効なページをアプリに返す必要があります。コンテンツは URL ごとに異なる必要はありません (index.htmlアプリを含む同じコンテンツを送信し、表示される内容を Backbone に処理させることができます) が、クライアントに何かを送信する必要があります。

コメントに基づいて編集:

期待どおりに動作しない理由は、Backbone アプリケーションを開始するために使用するページがデフォルトでそのルート URL になるため、ルーティングが実行されないためです。root履歴を開始するときに属性を設定してみてください( http://backbonejs.org/#History-startを参照)

于 2013-09-05T09:18:19.157 に答える