2

次のようなルートにバックボーンを正しく移動させる方法がわかりません。

ページ/#/チャンネル/名前

それ以外の

ページ#チャンネル/名前

また

ページ番号/チャンネル/名前

私のルーターは 1 つのメイン モデルで動作し、その状態を観察するため、この場合、ルーターはイベントをトリガーすることなく URL を変更できるはずです。

私はこのようにしようとしました:

router.navigate("#/channel/" + encodeURIComponent(appState.data.channelName), { trigger: false });

しかし、この場合、「trigger: false」が機能しなかったため、望ましくないルーター イベントが呼び出されました。

Backbone.history ルートは「/」に設定されており、現在 pushState を使用していません。

以下のコード例を参照してください。

var Router = Backbone.Router.extend({
    routes: {
        "": "index",            
        "index": "index",
        "channel/:channelName": "changeChannel"
    },

    initialize: function (options) {
        var router = this;

        if (options.model) {
            router.model = options.model;
        } else {
            //TODO: throw error
            return;
        }

        //update url in cases of model channelSelection changes
        router.model.on("stateChangeAccepted", function (appState) {
            switch (appState.mode) {
                case "channel":
                    router.navigate("/channel/" 
                        + encodeURIComponent(appState.data.channelName), { trigger: false });
                    break;                    
            }
        });
    },

    index: function () {
        var router = this;

        router.model.trigger("stateChangeRequest", {
            mode: "channel",
            data: {
                channelIndex: 0
            }
        });

    },

    changeChannel: function (channelName) {
        var router = this;

        router.model.trigger("stateChangeRequest", {
            mode: "channel",
            data: {
                channelName: decodeURIComponent(channelName)
            }
        });

    }
});
4

1 に答える 1

0

あなたのrouter.navigate通話は、あなたが定義したルートと一致しません:

routes: {
  "": "index",            
  "index": "index",
  "channel/:channelName": "changeChannel"
},

つまり、チャンネルの URL はhttp://host.com/#channel/someChannel. ただし、 router.navigate 呼び出しは または のいずれrouter.navigate('#/channel...)router.navigate('/channel...)です。そのはず:

router.navigate("channel/" + encodeURIComponent(appState.data.channelName), { trigger: false });

ただし、 のようなルートを使用する場合は、ルートを次のようhttp://host.com/#/channel/someChannelにする必要があります。

routes: {
  "": "index",            
  "index": "index",
  "/channel/:channelName": "changeChannel"
},

ナビゲートコールは次のようになります。

router.navigate("/channel/" + encodeURIComponent(appState.data.channelName), { trigger: false });
于 2012-06-25T13:07:59.417 に答える