Backbone的delegateEvents在附加到DOM

时间:2015-05-25 23:01:12

标签: javascript jquery backbone.js marionette

我正在聊天客户端工作,而且我遇到了Backbone的事件系统问题。

当客户端启动时,我将视图渲染为:

var view = new ServerListView({collection: Chatter.servers});
Chatter.Views.servers = view;
$('#channels > ul').html(view.render().el);

工作正常,事件被调用。 说到那些事件:

 events: {
            "click .server": "server",
            "click .server ul li": "channel",
            "click .server .slider": "slide"
 },

有问题的渲染方法:

render: function(){
            var self = this;
            this.$el.html("");
            this.collection.each(function(server){
                self.$el.append(self.template(server.toJSON()));
                var header = self.$el.find('li.server[data-id="' + server.id + '"]')
                var connection = Chatter.Connections[server.id];
                if (connection) {
                    if (connection.channels.length > 0) {
                        connection.channels.each(function(channel) {
                            $(header).find("ul").append("<li data-channel-id=\"" + channel.id + "\">" + channel.get('name') + "</li>");
                        }, self);
                    }
                }

            }, self);
            this.delegateEvents();
            return self;
        },

每次调用它时,它都应该正确地重新呈现包含所有服务器和通道的视图。一切都正确呈现,但事件没有被调用。

我以与呈现它相同的方式重新渲染它:

$('#channels > ul').html(Chatter.Views.servers.render().el);

无论出于何种原因,上面的事件在渲染时都没有被调用,任何想法?

由于

编辑:我忘了提一下:

如果我重新渲染它:

var view = Chatter.Views.servers;
$('#channels > ul').html(view.render().el);
view.delegateEvents();

然后它运作得很好,我知道这没关系,但我99%肯定我不应该这样做,我不想做那个每次我渲染视图。

再次感谢。

1 个答案:

答案 0 :(得分:1)

This stackoverflow question might help.你有视图的初始化函数吗?也许初始化函数可以接受一个参数(指定视图应该呈现的jQuery对象),以便它将自己呈现在页面上的适当位置,然后如果事件是'n',你可以在initialize函数中委托事件。 t自动委托。

无论如何,我很想听听别人的意见。