1

ここで、私には理解できない状況があります。誰かがこれを解決する方法を知っているなら、私は提案を聞きたいです.Thanks

アプリのサブナビゲーションバーに表示される「グローバルビュー」、つまりカレンダーがあります。このカレンダーはアプリケーション全体でグローバルカレンダーとして機能するため、ほとんどすべてのビューはカレンダービューとモデルを使用してショーデータを設定します選択した日付。

このカレンダービュー/モデルには、日付が変更されるたびに履歴に保存する方法が必要です。これは(私が思うに)、日付が変更されるたびに単一の URL またはクエリ文字列パラメーターを使用して行われます。

webapp/view1?date=20120301

日付が変更されると、クエリ文字列になります。

これにはクエリ文字列パラメーターを使用したいので、各ルートで (/:date) オプションのパラメーターを指定する必要はありません。

THE THING IS バックボーンは、クエリ文字列が変更されたときにルート変更または履歴イベントの発生を停止しました。Backbone.History 実装のクエリ文字列を無視するだけです。これにより、クエリ文字列が変更されるたびに追跡できないため、すべての実装が壊れています。そのため、「戻る」ボタンは変更イベントを発生させないため、カレンダーの日付を変更するモデルの日付を変更できません。

これに対する簡単な解決策は、「きれいなURL」を使用してその日付パラメーターを各ビューに追加することであることは知っていますが、それを避けようとしています。

助言がありますか?前もって感謝します


アップデート

バックボーンのドキュメントが示唆するように、「きれいな URL」を使用することになりました。クエリ文字列を使用すると、URL の変更と履歴を追跡するのに多くの問題が発生し、pushState の代わりに hashchange を使用すると期待どおりに機能しません。

したがって、私のコードは次のようになりました。

ルーター、ビュー、コントローラーなどのどこかに、ルーターの「ルート」イベントに接続して、日付の URI を確認し、この日付をカレンダー ピッカーに設定します。

this.listenTo(myRouter, "route", this.routeChanged);

次に、このメソッドは次のようになります。

checkURIdateParameter: function (route, arr) {
        var found = false; 
        for (var i = 0; i < arr.length ; i++) {
            if (arr && arr[i] && arr[i].indexOf("date=") != -1) {
                if (app.models.dateControl) {
                    var dateFromParameter = new Date(arr[i].substring("date=".length).replace(/\$/g, ":")); 
                    dateFromParameter = (isNaN(dateFromParameter.getTime())) ? app.models.dateControl.defaults.date : dateFromParameter;
                    app.models.dateControl.set("date", dateFromParameter);
                    found = true; 
                }
            }
        }
        if (!found) app.models.dateControl.set("date", app.models.dateControl.defaults.date, {changeURI:false}); 
    }

これは、URI からパラメーターを読み取り、それらの変更を dateControl に反映する関数として機能します。

日付が変更されるたびに URI を新しいものに更新する別の方法が必要であり (パラメーターがビューと同期するように)、リンクを問題なくコピーして貼り付けることができます。

ルーター、ビュー、コントローラーのどこかに:

this.listenTo(app.models.dateControl, "change:date", this.updateURIdateParameter); 

これは、現在の日付を持つモデルにアタッチされたメソッドです。このモデルは、カレンダー ピッカー (UI コントロール) またはルート イベント (routeChanged、上記参照) にリンクされたメソッドによって更新されます。

このメソッドは次のようにする必要があります。

, updateURIdateParameter: function (a, b, c) {
        if (c && c.changeURI == false) return; //this is in case i don't want to refresh the URI case the default date is set. 

        var currentFragment = Backbone.history.fragment;
        var newFragment = "";
        var dateEncoded = app.models.dateControl.get("date").toJSON().replace(/\:/g, "$");
        newFragment = currentFragment.replace(/\/date=([^/]+)/, "") + "/date=" + dateEncoded; 

        if (newFragment != currentFragment) {
            app.router.navigate(newFragment, false);
        }
    }

このメソッドは、対応するモデルから選択された currentDate を取得し、それを解析してから、Backbone.history.fragment から URL を取得し、古い日付パラメーター (存在する場合) を置き換える適切な正規表現を実行し、新しいエンコードされた日付を追加します。 . 次に、ルートをチェックするメソッドが呼び出されないように、サイレント モードでこのルートに移動します (これにより、迷惑なループが防止されます)。

これが役立つことを願っています。

4

1 に答える 1