37

Backbone.Router.navigateに設定さtestれますtrue:

var test = false;

var Router = Backbone.Router.extend({
  routes: {
    'posts': 'showPosts'
  },
  showPosts: function () {
    test = true;
  }
});

router = new Router();
Backbone.history.start();

router.navigate('posts?foo=3', {trigger: true});

assert.ok(test);

たとえば、posts?foo=3フラグメントはpostsデフォルトでルートと一致しますか、それとも別のルートを設定する必要がありますposts?*querystringか?

ありがとうございました

PS: backbone-query-parametersが存在することは知っていますが、 backboneについてだけ知りたいです。

4

5 に答える 5

67

その予想されるパラメーターを使用して別のルートを追加する必要があります。

routes: {
    'posts?foo=:foo' : 'showPosts',
    'posts': 'showPosts'
},
showPosts: function (foo) {
    if(typeof foo != 'undefined'){
       // foo parameters was passed
    }
    test = true;
}

更新
すべてのクエリ文字列を返すように一般的なルートを定義し、それをハンドラーで解析できます。

routes: {
   'posts': 'showPosts',
   'posts?*queryString' : 'showPosts'
},
showPosts: function (queryString) {
    var params = parseQueryString(queryString);
    if(params.foo){
        // foo parameters was passed
    }
}  
...
// and the function that parses the query string can be something like : 
function parseQueryString(queryString){
    var params = {};
    if(queryString){
        _.each(
            _.map(decodeURI(queryString).split(/&/g),function(el,i){
                var aux = el.split('='), o = {};
                if(aux.length >= 1){
                    var val = undefined;
                    if(aux.length == 2)
                        val = aux[1];
                    o[aux[0]] = val;
                }
                return o;
            }),
            function(o){
                _.extend(params,o);
            }
        );
    }
    return params;
}

更新 2

コードの動作を確認するためのライブ デモを次に示します

于 2012-07-26T14:25:01.017 に答える
18

次のように、同じコールバックを持つ 2 つのルートを定義する代わりに、前の回答を補完するだけです。

routes: {
    'posts': 'showPosts',
    'posts?*querystring': 'showPosts'
}

コードをきれいに保つために、ルートは 1 つだけにすることができます。

routes: {
    'posts(?*querystring)': 'showPosts'
}
于 2014-02-14T18:24:29.443 に答える
6

バックボーン ドキュメント:

ルートには、スラッシュ間の 1 つの URL コンポーネントに一致するパラメータ パーツ :param を含めることができます。およびスプラット パーツ *splat は、任意の数の URL コンポーネントと一致できます。

一致せずに機能を維持したい場合は、2 つのルートを定義できます。

routes: {
  'posts': 'showPosts',
  'posts?*querystring': 'showPosts'
}

showPosts: function(querystring) {
  if (querystring) {
    // here you can parse your querystring, for your case the querystring variable is 
    // 'foo=3'
  }
  //here you'll show posts according to the querystring (or lack thereof)      
}
于 2012-07-26T14:34:14.007 に答える
1

RFC 3986 の「URI の構文」では、クエリ パラメータがハッシュ フラグメントの前に来る必要があると規定されています。

URI では、ハッシュマーク # により、URL の末尾近くにオプションのフラグメントが導入されます。URI の一般的な RFC 3986 構文では、疑問符 ? によって導入されるオプションのクエリ部分も使用できます。クエリとフラグメントを含む URI では、フラグメントがクエリの後に続きます。

サーバーから取得したリダイレクト、つまり「http://foo.com/main.html?error=errormessage#site」の処理に問題があります。クエリでルーティングしたいのですが、この URL を処理するバックボーン ルート式を記述する方法がわかりません。今のところ、ハッシュをルーティングし、location.search を解析してクエリを確認するだけです。

于 2015-02-13T20:50:44.717 に答える