Backbone click事件触发所有集合而不是模型的事件

时间:2012-02-12 19:17:18

标签: events backbone.js

无法弄清楚出了什么问题。当我点击模型标题时,它会立即获取集合中的所有模型,而不是获取一个模型。如果我将此事件从logView移动到logsView它可以正常工作但无法访问模型,那么我可以使用索引或ant其他模型的ID找到此模型,但不要认为这是一个很好的方法。

var Log = Backbone.Model.extend({});


window.LogsList = Backbone.Collection.extend({
    model:Log,

    url:function (tag) {
        this.url = '/logs/' + tag;
        return this;
    }
});

window.colList = new LogsList();

window.logView = Backbone.View.extend({
    el:$('.accordion'),

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

    initialize:function () {
        this.model.bind('add', this.render, this);
    },

    events:{
        "click .accordion-toggle" :"getLogBody"
    },

    render:function () {
        return this.template(this.model.toJSON());
    },

    getLogBody:function () {
        this.model.fetch();
    }
});

window.LogsView = Backbone.View.extend({
    el:$("#content"),

    initialize:function (options) {
        colList.bind('reset', this.addAll, this);
        colList.url(options.data).fetch();
    },

    addOne:function (model) {
        var view = new logView({model:model});
        $("#accordion").append(view.render());
    },

    addAll:function () {
        colList.each(this.addOne);
    }
});

window.listView = new LogsView({data:"Visa_Cl"});

1 个答案:

答案 0 :(得分:10)

问题是由LogView中的el引起的:el:$('.accordion')

Backbone的观看事件是视图el的范围。在这种情况下,您已将视图的el指定为所有 HTML元素,其类别为" accordion"。因此,当您使用此类单击任何 HTML元素时,代码将针对所有这些运行,这就是您看到此行为的原因。

本文将向您展示一些正确执行所需操作的选项:

我还建议阅读这篇文章,以便更好地理解Backbone中el的使用,以及它的一些技巧和陷阱: