Подтвердить что ты не робот

Магистраль: обновить один и тот же маршрут маршрута в два раза

Я заметил, что метод навигации по базовому маршрутизатору не перезагружает путь, если он уже находится на этом маршруте.

Например, маршрут уже по пути /view 1, вы вызываете 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", она будет проигнорирована.

Мой вопрос: как я могу активировать событие маршрута, если он уже находится на том же пути.

4b9b3361

Ответ 1

Есть несколько вещей, которые могли бы выполнить это. Если вы ожидаете перехода на маршрут, который уже находится в URL-адресе, сначала проверьте текущий фрагмент маршрута на Backbone.history.fragment и посмотрите, совпадает ли он с маршрутом, который вы хотите активировать. Если это так, вы можете выполнить любое из следующих действий:

  • Вы можете просто вызвать метод маршрута напрямую: sys.view1();

  • Вы можете установить фрагмент на другой мертвый маршрут, а затем вернуться к желаемому маршруту.

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

  • Вы можете остановить и перезапустить маршрутизатор:

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

    Это снова запустит маршрут и запустит его.

Думаю, я поеду с №1.

Ответ 2

Вместо того, чтобы запускать и останавливать историю магистральной сети, вы можете вызвать 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 internal `navigate` method calls this anyways.
var ret = Backbone.history.navigate(href, true);

// Typically Backbone 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);
}