Отключить маршрутизатор в backbone.js

Поэтому мне нужно удалить маршрутизатор в backbone.js, чтобы предотвратить его маршрутизацию. Я пробовал myRouter.off() и myRouter.remove() без везения.

Что я могу сделать вместо этого?

Ответ 1

Нет официально поддерживаемого способа сделать это (что я знаю). Если вы хотите отключить любой маршрутизатор, вы можете использовать Backbone.history.stop();, который недокументирован, но отображается в исходном коде с этим комментарием:

// Disable Backbone.history, perhaps temporarily. Not useful in a real app,
// but possibly useful for unit testing Routers.

В противном случае вам придется закодировать какое-то условие пересылки в ваших обработчиках маршрутизации маршрутизатора, если состояние маршрутизатора "отключено" или что-то в этом роде. Или итерации на недокументированном Backbone.history.handlers(внутренний массив, содержащий .route - как regexp - и .callback), и удалите маршруты, связанные с этим конкретным маршрутизатором.

Очевидно, что, будучи недокументированным и все, это может быть изменено в будущих выпусках Backbone.

Ответ 2

если вы можете управлять созданием своего маршрутизатора, вы можете сделать следующее:

var myRouter = new MyRouter({ routes: function(){
  return;
}});

Ответ 3

Вы можете использовать хакерское решение (он использует методы, отличные от API, и может перестать работать с новыми версиями Backbone.js)

var router = new(Backbone.Router.extend({

  routes: {
    "authentication": "authentication",
    "contacts": "contacts",
    "*notFound": "notFound"
  },

  /**
   * @param {string} routeName
   */
  disableRoute: function(routeName) {
    var index, handler, handlers = Backbone.history.handlers;
    delete this.routes[routeName];
    for (var i = 0, len = handlers.length; i < len; i++) {

      handler = handlers[i];
      if (handler.route.toString() === router._routeToRegExp(routeName).toString()) {
        handlers.splice(index, 1);
        break;
      }
    }
  },

  contacts: function() {
    alert('route `contacts`');
  },
  authentication: function() {
    alert('route `authentication`');
  },
  notFound: function() {
    alert('route `notFound`');
    router.navigate('404');
  }
}));

Backbone.history.start({
  silent: true
});

$(function() {
  $('#remove').on('click', function() {
    router.disableRoute('authentication');

    router.navigate('404');
  });

  $('#goto_auth').on('click', function() {
    router.navigate('authentication', {
      trigger: true
    });
  });

  $('#goto_contacts').on('click', function() {
    router.navigate('contacts', {
      trigger: true
    });
  });
});
button {
  display: block;
  margin: 10px;
}
<html>

<head>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.1.2/backbone-min.js"></script>

</head>

<body>
  <button id="goto_auth">goto authentication route</button>
  <button id="goto_contacts">goto contacts route</button>
  <hr>
  <button id="remove">remove authentication route</button>
</body>

</html>