Backbone.js: повторно заполнить или воссоздать представление?

В моем веб-приложении у меня есть список пользователей в таблице слева и панель подробностей пользователя справа. Когда администратор нажимает на пользователя в таблице, его подробная информация должна отображаться справа.

У меня есть UserListView и UserRowView слева, и UserDetailView справа. Все вроде бы работает, но у меня странное поведение. Если я нажимаю на некоторых пользователей слева, а затем нажимаю удалить одного из них, я получаю последовательные поля подтверждения javascript для всех пользователей, которые были отображены.

Похоже, что привязки событий всех ранее отображенных представлений не были удалены, что кажется нормальным. Я не должен каждый раз делать новый UserDetailView на UserRowView? Должен ли я поддерживать представление и изменять его ссылочную модель? Должен ли я отслеживать текущее представление и удалять его перед созданием нового? Я немного запутался и любая идея будет приветствоваться. Спасибо!

Вот код левого представления (отображение строки, событие клика, создание правого представления)

window.UserRowView = Backbone.View.extend({
    tagName : "tr",
    events : {
        "click" : "click",
    },
    render : function() {
        $(this.el).html(ich.bbViewUserTr(this.model.toJSON()));
        return this;
    },
    click : function() {
        var view = new UserDetailView({model:this.model})
        view.render()
    }
})

И код правого представления (кнопка удаления)

window.UserDetailView = Backbone.View.extend({
    el : $("#bbBoxUserDetail"),
    events : {
        "click .delete" : "deleteUser"
    },
    initialize : function() {
        this.model.bind('destroy', function(){this.el.hide()}, this);
    },
    render : function() {
        this.el.html(ich.bbViewUserDetail(this.model.toJSON()));
        this.el.show();
    },
    deleteUser : function() {
        if (confirm("Really delete user " + this.model.get("login") + "?")) 
            this.model.destroy();
        return false;
    }
})
82
задан tereško 23 August 2014 в 10:50
поделиться