【问题标题】:Backbone treat model like collection骨干对待模型喜欢集合
【发布时间】:2016-10-25 14:10:04
【问题描述】:

由于 Collections 实际上是一个模型,它有属性等等,就像这个例子中一样

var Images = Backbone.Collection.extend({
  url: 'https://api.myjson.com/bins/4v2d8'
});

var View = Backbone.View.extend({
  el: $('.images'), 

  initialize: function(){
    this.listenTo(this.collection, 'sync', this.render, this); // what is this keyword as the last param here?
  },

  render: function(){

    this.collection.each(function(model){
      this.$el.append($('<p>'+model.get('name')+'</>' ));
    }, this);

  }
});

$(function(){

  var images = new View({ collection: new Images() });

  images.collection.fetch();

});

http://jsbin.com/gohedeguto/edit?html,js,output

但是为什么这个不起作用?

http://jsbin.com/seyoyeqeku/edit?html,js,output

我将Collection 替换为Model 并传递给视图。我收到了this.model.each of undefined

【问题讨论】:

  • “因为 Collections 实际上是一个模型” - 什么?您是从哪里/如何得出这个结论的?
  • 其实是个假账号

标签: javascript jquery backbone.js


【解决方案1】:

虽然T-J 是对的,但他没有详细说明原因。

主干模型有很多函数来管理attributes hash,并且经常被一个id引用。

Backbone 集合 是 Backbone 模型实例的数组。它有一些类似的和许多不同的功能来管理它的models array property,这是存储模型实例的地方。

其中一些函数是Underscore.js 函数的代理。

Model's Underscore methods

  • 价值观
  • 反转
  • 挑选
  • 省略
  • 是空的

Collection's Underscore methods

目前共有 46 个,请参阅列表。


collection.each(iteratee, [context])

_.each(collection.models, iteratee, [context])的代理。

Backbone 的模型没有 each 函数,因为它没有真正意义,并且有更好的方法来循环遍历模型的属性。

【讨论】:

  • 请检查此链接api.myjson.com/bins/4v2d8我不是说他错了,只是检查
  • @V.S.V 是的,我已经看到了,要传递给集合的标准模型数组。我错过了什么?
  • 你读过这个问题吗?这家伙想把它改成模型(不是收藏)@Emile Bergeron
  • @VSV 我完全阅读了这个问题,它并没有真正解释桑迪想要什么,只是 this.model.each 是未定义的。 你的回答只是错误地使用了一个像收藏。这没有意义。
  • 对不起我的错 :(
【解决方案2】:

因为 Collections 实际上是一个模型

没有。这是错误的假设。集合不是模型,这就是您的代码不起作用的原因。

模型没有 each 方法,您的代码会抛出以下错误:

Uncaught TypeError: this.model.each is not a function(…)

并且不要遵循迭代模型属性并打印其名称的其他答案,这没有意义。因为模型应该代表一个实体,比如一个人。它只有一个包含名称的属性,迭代模型属性以访问其中一个是没有意义的,您可以使用get() 方法直接访问它的属性而无需迭代。

【讨论】:

  • 在这种情况下模型返回列表
  • @V.S.V 然后您应该首先使用get() 访问该属性,然后使用_.each()(或您喜欢的任何循环)对其进行迭代以访问项目。从模型的角度来看,它只是另一个属性......
  • 你会从 model.get() 列表项中得到什么?
  • @V.S.V 该端点正在返回一个 Array 项。为此,您需要一个模型集合,而不是单个模型。型号为单品。
  • 我知道我只是编写模型,它会像集合一样工作(这是一个不好的做法)。我只是写了在他的情况下可行的方法,很抱歉投反对票,我会改变它:)
猜你喜欢
  • 2012-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多