Как предотвратить маршрутизацию в Backbone.js?

Когда я нажимаю "Отмена" на первой странице - все в порядке. Но "Отмена" не работает, когда я перехожу на "Вторая страница". В этом случае маршрутизатор перенаправляет приложение на "" маршрут. Мне нужно предотвратить это перенаправление.

"Отмена" - скрыть ссылки, "Вторая страница" - перейти на вторую страницу

<script type="text/html" id="template">
    <a href="#" class="cancel">Cancel</a>
    <a href="#second">Second page</a>
</script>

<div id="container"></div>    

<script>
var View = Backbone.View.extend({

    template: $('#template').html(),

    events: {
        "click .cancel": "cancel"
    },

    cancel: function () {
        this.$el.hide();
    },

    render: function () {
        this.$el.html(this.template);
        return this;
    }
});

var AppRouter = Backbone.Router.extend({

    routes: {
        "": "first",
        "second": "second"
    },

Создать представление и заменить HTML контейнера

    links: function () {
        var view = new View;
        $('#container').html(view.render().el);
    },

    second: function () {
        this.links();
        $('#container').prepend("<h1>Second page</h1>");
    },

    first: function () {
        this.links();
        $('#container').prepend("<h1>First page</h1>");
    }

});

$(document).ready(function () {
    app = new AppRouter;
    Backbone.history.start();
});
</script>

2 ответа

Решение

Я думаю, что вы должны вернуть false из обработчика отмены, чтобы предотвратить переход к #:

cancel: function (e) {
        this.$el.hide();
        return false;
    },

http://api.jquery.com/on/ говорит:

Возвращение false из обработчика событий автоматически вызовет event.stopPropagation() и event.preventDefault().

Вы также можете решить проблему блокировки хеш-кодов многократным способом, как в этом ответе:

Запретить переход к другому представлению, если содержимое не сохранено

Это решение предотвращает срабатывание обратных вызовов маршрутизатора Backbone, и хотя он может работать только ПОСЛЕ изменения хеша, эта функция возвращает предыдущий фрагмент хеша, поэтому его нельзя заметить


Кроме того, для этой конкретной проблемы, вы можете просто изменить

<a href="#">...</a>

к

<a>...</a>

он будет действовать как обычный тег HTML (например, курсор установлен на pointer) но никуда не денешься

Другие вопросы по тегам