如何在骨干中获取事件类型?

时间:2012-11-23 08:28:44

标签: javascript model-view-controller backbone.js

在骨骼中收集和查看

var studentmodel = Backbone.Model.extend();

    var studentcollection = Backbone.Collection.extend({
model : studentmodel,
url : 'http://localhost/bb/data.JSON',
parse : function(response){
    //console.log(response.data);
    return response.data;
    //return response;
},
  });



var studentlistview = Backbone.View.extend({
    tagName : "ul",
    className : "studentlistul",
    initialize : function(){
        this.model.bind("reset", this.checkEvent,this);
        this.model.bind("add", this.checkEvent,this);
    },
      checkEvent : function(){

        $(this.el).html("");

    _.each(this.model.models, function(student){

    $(this.el).append(new studentListItemView({ model : student}).render2().el);
    }, this);

    $('#studentlistdiv').html($(this.el));

    return this;

}     });

并尝试将项目添加到此模型及其工作中,我的问题是内部渲染fn我怎样才能获得事件类型而this.model.bind(“add”,this.checkEvent,this)这个evt fire。在checkEvent中我如何获得事件类型,即哪一个触发添加或重置。这是我的问题,请帮助我

1 个答案:

答案 0 :(得分:2)

Backbone事件处理程序没有可靠的方法来知道触发它的事件。而不是这样做:

this.model.bind("reset", this.checkEvent, this);
this.model.bind("add",   this.checkEvent, this);

您应该为每个所需的操作设置单独的处理程序:

// A reset generally means that you want to redraw the whole thing.
this.model.bind("reset", this.render, this);

// If one model is added then you usually just want to render the
// the new one.
this.model.bind("add", this.render_one, this);

然后你的render看起来会像这样:

this.$el.empty();
this.collection.each(this.render_one, this);
return this;

我在这里时还有一些额外的事情:

  1. 骨干视图已在this.$el中拥有this.el的jQuery版本,因此无需$(this.el),只需使用this.$el
  2. 骨干视图处理collection option的方式与处理model的方式相同。因此,如果您new View({ collection: c }),则视图将自动拥有this.collection。如果您有一个集合,请使用collection,如果您有模型,请使用model;使用准确的名称不那么容易混淆。
  3. Backbone集合有很多Underscore methods already mixed in,因此您可以说this.collection.each(...)而不是_(this.collection.models, ...)