通过Backbone.PageableCollection迭代无法正常工作

时间:2014-02-12 03:36:08

标签: javascript backbone.js coffeescript underscore.js backbone.paginator

我有一个Backbone.PageableCollection@customers)我希望迭代的模型。我尝试了很多东西 - 包括我认为很明显的东西:

@customers.each (customer) ->
  console.log customer

不幸的是,这会导致看起来像集合但没有模型数据的东西。我知道该集合已完全同步,因为当我退出@customers.models时,我可以看到一组模型数据:

enter image description here

奇怪的是,如果我这样做:

_.each @customers.models, (customer) ->
  console.log customer

我得到了与上面相同的无益结果。

我错过了什么?

更新

仔细观察console.log customer在两种方法中记录的对象,这看起来像是具有未填充属性的模型。这很奇怪,因为日志记录@customers.models显示了一个完全填充属性的模型数组。另外,each循环只执行一次。

更新2:

我根据agconti的建议尝试了以下内容:

@customers.each (@customers, c) ->
  console.log @customers, c

编译为:

      return this.customers.each((function(_this) {
        return function(customers, c) {
          _this.customers = customers;
          return console.log(_this.customer, c);
        };
      })(this));

并记录undefined0

更新3:

如果我设置:

window.customers = @customers

然后将其输入控制台:

_.each(customers.models, function (customer) { return console.log(customer)});

我得到了所有客户模型的日志。我现在真的很困惑......

更新4:

我把它缩小到时间问题。我在集合同步后运行此代码,但似乎集合中的模型解析会在稍后发生。

3 个答案:

答案 0 :(得分:0)

您需要为.each()指定一个迭代器。这样做:

@customers.each (@customers, c) ->
  console.log c

如果您检查.each()上的主干文档,您会发现它包含三个属性; (list, iterator, [context])。由于您只是记录客户而不是客户集合的迭代器,因此只记录整个集合。

答案 1 :(得分:0)

骨干集合的模型存储在Collection.models,这就是你需要迭代的东西。 什么时候做     _.each @customers,您正在迭代集合对象的属性,而不是其模型 所以你想要的是 _.each @customers.models, (customer) -> console.log customer

答案 2 :(得分:0)

这在我的提取/同步代码中遇到了一些问题。这个代码不应该在客户集合完全同步之前运行,但是某些东西(尚未确定)允许它在集合完全同步之前运行。