【问题标题】:Backbone Collection View is only rendering last object in the collection骨干集合视图仅呈现集合中的最后一个对象
【发布时间】:2014-11-02 15:36:34
【问题描述】:

我正在尝试将 Collection View 的渲染输出放置到 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,
});

收藏视图

改编自我在 Backbone 上的 Codeschool 课程

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 中提取时)认为问题可能与 question 类似,但是现在我正在使用自己的 testFilms 进行重置,我可以肯定我没有覆盖或设置任何我不应该的id 属性。

有人有什么想法吗?

【问题讨论】:

  • 我认为可能是您将 FilmView 的 el 设置为一个 id,该 id 应该始终是唯一的,但是然后您遍历集合并使用当前模型不断重置该 el/id,因为每个FilmView 将具有相同的 el
  • @Lbatson 你明白了 - 谢谢你!我已经从 FilmView 中删除了它,而是将 FilmListView 的 el 设置为#filmContainer。谢谢!
  • @lbatson 如果您想将其作为答案发布,我会接受它,以便您获得 +rep。

标签: javascript backbone.js


【解决方案1】:

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

【讨论】:

  • 我认为这或多或少是对的。代码似乎试图渲染每个模型两次:一次是在FilmView.prototype.render 中,另一次是在FilmListView.prototype.addOne 中对this.$el.append 的调用。当然,您只需要其中之一。此答案适用于 render 方法。 append 不应该被以前渲染的 HTML 覆盖。但是,FilmListView 对象不知道要附加到哪个 HTML 元素。也许它附加到不在 DOM 中的 jQuery 对象,因此不可见,但可以稍后添加。
  • 你是对的。 FilmListView 应该有 id,我相信 @Cian Mac Mahon 现在已经更新了。由于FilmView 每次this.$el = $('#filmContainer'); 都使用相同的ID,因此render 在集合的每次迭代中将html() 设置为当前模型,因此它被覆盖。
  • 是的,这就是答案,我在 FilmView 而不是 FilmListView 中设置了元素,因为该项目的早期阶段我还没有使用集合。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-08
  • 2015-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多