主干集合视图仅渲染集合中的最后一个对象

Backbone Collection View is only rendering last object in the collection

本文关键字:集合 最后 一个对象 视图      更新时间:2023-09-26

我正在尝试将集合视图的渲染输出放置到dom上。但是,在流程结束时,页面上只显示集合中的最后一个对象。

我在视图上设置了一个事件处理程序,这样当一个项目被单击时,它的title就会被注销。每当我点击放置在Dom上的这个单一元素时,我的每个对象的标题都会被记录下来,即使只显示一个,所以每个处理程序都被应用到最后一个元素,但不知何故会注销正确的标题。

有人知道我如何渲染集合中的每一项而不仅仅是最后一项吗?下面是我的代码的快速浏览。

最终目标是列出每部电影的名字。

型号

首先,定义模型-这里没有什么令人兴奋的

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

查看

这是我为胶片模型制作的视图的简化版本

var FilmView = Backbone.View.extend({
  // tagName: 'li',
  initialize: function() {
    this.$el = $('#filmContainer');
  },
  events: {
    'click': 'alertName'
  },
  alertName: function(){
    console.log("User click on "+this.model.get('title'));
  },
  template: _.template( $('#filmTemplate').html() ),
  render: function(){
    this.$el.html( this.template( this.model.attributes ) );
    return this;
  }
});

集合

再次,似乎是标准的。

var FilmList = Backbone.Collection.extend({
  model: FilmModel,
});

集合视图

改编自代码学校的主干课程

var FilmListView = Backbone.View.extend({
  // tagName: 'ul',
  render: function(){
    this.addAll();
    return this;
  },
  addAll: function(){
    this.$el.empty();
    this.collection.forEach(this.addOne, this);
  },
  addOne: function(film){
    var filmView = new FilmView( { model: film } );
    this.$el.append(filmView.render().el);
    // console.log(this.$el);
  }
});

开始时间

var filmList = new FilmList({});
var filmListView = new FilmListView({
  collection: filmList
});

var testFilms = [
  {title: "Neverending Story"},
  {title: "Toy Story 2"}
];
filmList.reset(testFilms);
filmListView.render();

到目前为止,根据我对Backbone的理解,这应该做的是添加,使用FilmView中指定的模板将filmList集合中的每个项目渲染到filmListView中的el中。

然而,实际发生的情况是,最终标题总是放在DOM上。

我最初(当这是从API引入时)认为这个问题可能与这个问题类似,但现在我正在用自己的testFilms重置,我可以肯定我没有覆盖或设置任何不应该覆盖或设置的id属性。

有人有什么想法吗?

我认为可以将FilmView的el设置为一个id,该id应该始终是唯一的,但是,然后循环遍历集合,并使用当前模型不断重置该el/id,因为每个FilmView都将具有相同的el