0

我将模型发送到模板。该模型有一个集合。在模板中,我回显了一些变量和函数:

console.log(comments);
console.log(_.size(comments));
console.log(comments instanceof App.Collections.Comments);
console.log(_.pluck(comments, 'created'));
_.each(comments, function(com) {
    console.log(com);
});

前三个有效,但后两个下划线函数无效。Pluck 给出 3x undefined 并且每个都不会迭代。

Object { length=3, models=[3], _byId={...}, more...}
3
true
[undefined, undefined, undefined]

如何使下划线功能起作用?

4

2 回答 2

1

Backbone 集合混合了一些 Underscore 方法,因此您可以直接在集合实例上使用 Underscore 方法:

console.log(comments.pluck('created'));
comments.each(function(com) { console.log(com) });

演示:http: //jsfiddle.net/ambiguous/3jRNX/

这个:

console.log(_.size(comments));

对你来说很好,因为_.size看起来像这样:

_.size = function(obj) {
  return _.toArray(obj).length;
};

_.toArray调用集合的toArray

// Safely convert anything iterable into a real, live array.
_.toArray = function(iterable) {
  if (!iterable)                return [];
  if (iterable.toArray)         return iterable.toArray();
  if (_.isArray(iterable))      return slice.call(iterable);
  if (_.isArguments(iterable))  return slice.call(iterable);
  return _.values(iterable);
};

它解开集合的数据,为您提供正确的长度。以上取自 1.3.1 源,当前 Github master 版本_.size实现不同,因此您的_.size调用可能会在升级期间中断。

于 2012-04-04T08:33:38.847 回答
1

您需要直接在集合上调用 pluck,因为 Collection 类支持它:

http://documentcloud.github.com/backbone/#Collection-pluck

所以而不是:

_.pluck(comments, 'created')

你应该打电话:

comments.pluck('created');
于 2012-04-04T08:25:38.980 回答