Событие вызывается несколько раз после использования кнопки «Назад» в Backbone.js - PullRequest
3 голосов
/ 25 октября 2011

Я создаю приложение Backbone и столкнулся с этой странной проблемой.В состоянии A (route: "") у меня есть такое представление:

var view = Backbone.View.extend({
    events : {
         "click a.continue" : "next"
    },

    next : function(e) {
       //Some stuff
       Backbone.history.navigate("/page2");
    }
});

, и как только я нажимаю на якорь с классом " continue ", яперенаправлен в состояние B (маршрут: "/ page2").Если я нажму на кнопку «Назад» в своем браузере, а затем нажму на «якорь», при отладке я заметила, что функция next запускается дважды.На самом деле, если я продолжу идти вперед и назад, количество раз, когда событие будет запущено, будет увеличиваться.

Любая подсказка?

Заранее спасибо

Ответы [ 2 ]

9 голосов
/ 25 октября 2011

У вас есть вид зомби.

Суть этого в том, что когда вы создаете экземпляр и отображаете второй вид («состояние B»), вы не избавляетесь от первого вида.Если у вас есть какие-либо события, связанные с HTML представления или моделью представления, вам нужно очистить их, когда вы закроете форму.

Я написал подробное сообщение в блоге об этом, здесь: http://lostechies.com/derickbailey/2011/09/15/zombies-run-managing-page-transitions-in-backbone-apps/

Обязательно прочитайте комментарии, поскольку «Джонни О» предоставляет альтернативную реализацию, которая, на мой взгляд, является блестящей.

4 голосов
/ 12 мая 2012

У меня та же проблема, решение ...

    App.Router = Backbone.Router.extend({
    routes: {
        "fn1": "fn1",
        "fn2": "fn2"
    },
    stopZombies: function(objView){
        if(typeof objView === "object"){
            objView.undelegateEvents();
            $(objView.el).empty();
        }
    },
    fn1: function(){

        this.stopZombies(this.lastView);

        var view1 = new App.v1();
        this.lastView = view1;
    },
    fn2: function(){

        this.stopZombies(this.lastView);

        var view2 = new App.v2();
        this.lastView = view2;
    }
});

Сохраните последнее представление выполнения в this.lastView, затем stopZoombies () удалите события из этого представления.

...