【问题标题】:Returning a Backbone Collection and iterating through - not with a View返回主干集合并迭代 - 不是使用视图
【发布时间】:2014-11-06 14:32:08
【问题描述】:

我正在返回一个从 Mongodb 数据库返回的对象集合,并希望找出返回了多少模型,并能够遍历它们并基于它创建一些 DOM 元素。我没有使用 Backbone.View,而是使用 Famo.us。

我创建了一个集合并将其返回,但我似乎无法访问其中的模型或它们的数据 - 想知道您是否可以提供帮助 :)

这是模型/系列:

define( function (require, exports, module) {
  'use strict';

  var Backbone = require('backbone');

  var Book = Backbone.Model.extend({
    idAttribute: "_id"
  });

  var BookCollection = Backbone.Collection.extend({
    model: Book,
    url: "http://localhost:3000/api/books"
  });
  module.exports = BookCollection;
});

在主文件中,我使用以下方法实例化集合:

    this._bookCollection = new BookCollection();
    this._bookCollection.fetch({reset: true});

    var _bookCollection = this._bookCollection;
    console.log(_bookCollection);
    console.log(_bookCollection.length);

“console.log(_bookCollection)”将返回类似于:

n {length: 0, models: Array[0], _byId: Object, constructor: function, model: function…}
_byId: Object
length: 250
models: Array[250]
[0 … 99]
[100 … 199]
[200 … 249]
length: 250
__proto__: Array[0]
__proto__: s

所以我知道它会返回一些东西,因为我期望返回 250 个“模型”。因为它不是一个真正的数组 - 你不能做 _bookCollection.length (它对我不起作用)。我如何遍历返回的内容,以便我可以获取每个模型,然后用该模型“做”一些事情?我正在使用 Famo.us,所以想要创建除 Backbone.View 之外的其他东西。

谢谢

-- 更新

在“this._bookCollection.fetch({add:true});”之后浏览器显示我有:

 {length: 0, models: Array[0], _byId: Object, _events: Object, constructor: function…}_byId: Object_events: Objectlength: 250models: Array[250]__proto__: n

如果你展开它,它会告诉你长度是 250,并且在“模型”(Array[250]) 中有我要查找的数据,分为 [00..99]、[100..199]等等

我是在错误地检索集合还是在不创建视图的情况下真的无法做到这一点?

【问题讨论】:

    标签: backbone.js backbone.js-collections


    【解决方案1】:

    Collection.fetch 是异步的,您的数据不会立即可用。你将不得不使用fetch返回的承诺:

    _bookCollection.fetch({reset: true}).then(function() {
        console.log(_bookCollection.length, _bookCollection.pluck('_id'));
    });
    

    或 Backbone 提供的事件:

    _bookCollection.on("sync", function() {
        console.log(_bookCollection.length, _bookCollection.pluck('_id'));
    });
    _bookCollection.fetch({reset: true});
    

    设置好回调后,您可以使用适合您的任何渲染方式。

    奖金:why console.log tripped you

    【讨论】:

    • 感谢您告诉我有关“同步”的信息。我可以一次“提取”多个属性,以便获取每个模型的值吗?
    • 我不确定我理解你想要什么。您可以随心所欲地操作模型:例如,Collection.toJSON 将所有模型序列化,或使用集合 backbonejs.org/#Collection-Underscore-Methods 上代理的 Underscore 方法
    • 如果我尝试 Collection.toJSON,它会返回空。我已经用我看到的内容更新了问题
    【解决方案2】:

    Underscore.js 函数应该可以很好地为您服务。我不确定您想对集合中的模型做什么,但请查看http://underscorejs.org/,它有很多方法可以处理骨干集合。例如你可以做

    _.toArray(_bookCollection).length
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-08
      • 2012-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-07
      • 1970-01-01
      • 2015-01-31
      相关资源
      最近更新 更多