22

バックボーンルーターのnavigateメソッドが現在のパスをリロードしないことに気づきました。

たとえば、現在のルートは/view1であり、を呼び出しますrouter.navigate('view1',{trigger:true});。ルートイベントが再度アクティブになることはありません。

私がテストするコードは次のとおりです。

<html>
<head>
    <title>Testing123</title>
    <script src="http://code.jquery.com/jquery.min.js" type="text/javascript"></script>
    <script src="http://underscorejs.org/underscore-min.js" type="text/javascript"></script>
    <script src="http://backbonejs.org/backbone-min.js" type="text/javascript"></script>
    <style type="text/css" media="screen">
        #box{
            width:400px;
            height:400px;
            background-color:red;
        }       
    </style>
</head>
<body>
    <button id='view1'>view1</button>
    <button id='view2'>view2</button>
    <br/>
    <div id='box'>

    </div>
    <script type="text/javascript" charset="utf-8" async defer>
        var SystemRouter = Backbone.Router.extend({

          routes: {
            "view1":"view1",
            "view2":"view2"
          },

          view1: function() {
            console.log('view1');
          },

          view2: function() {
            console.log('view2');
          }

        });

        var sys = new SystemRouter();
        Backbone.history.start({pushState: true, root: "/test/routing.html#/"});
        sys.navigate('view1');

        $('#view1').click(function(){
            sys.navigate('view1',{trigger:true});
        });

        $('#view2').click(function(){
           sys.navigate('view2',{trigger:true});
        }); 
    </script>
</body>
</html>

上記のコードは/view1パスをロードし、「view1」を出力します。ただし、ボタンをクリックして/view1パスに移動しようとすると、無視されます。

私の質問は、ルートイベントが現在のパスと同じである場合、どのように呼び出すのですか?

4

2 に答える 2

32

これを達成するいくつかのことがあります。すでにURLにあるルートに移動することが予想される場合は、最初にで現在のルートフラグメントをチェックし、Backbone.history.fragmentアクティブ化するルートと同じかどうかを確認します。その場合は、次のいずれかを実行できます。

  1. routeメソッドを直接呼び出すことができます。sys.view1();

  2. フラグメントを別のデッドルートに設定してから、目的のルートに戻すことができます。

    sys.navigate('someDeadRoute'); sys.navigate('view1',{trigger: true});

  3. ルーターを停止して再起動できます。

    Backbone.history.stop(); Backbone.history.start()

    これにより、ルートが再度ピックアップされ、実行されます。

私は#1で行くと思います。

于 2013-01-25T18:21:27.247 に答える
29

Backboneの履歴を開始および停止するのではなく、を呼び出すことができますBackbone.history.loadUrl

現在のページを更新するには:

Backbone.history.loadUrl(Backbone.history.fragment);

またはリンクハンドラーとして:

// `Backbone.history.navigate` is sufficient for all Routers and will trigger the
// correct events. The Router's internal `navigate` method calls this anyways.
var ret = Backbone.history.navigate(href, true);

// Typically Backbone's history/router will do nothing when trying to load the same URL.
// But since we want it to re-fire the same route, we can detect 
// when Backbone.history.navigate did nothing, and force the route.
if (ret === undefined) {
    Backbone.history.loadUrl(href);
}
于 2014-09-11T01:22:18.220 に答える