Backbone.js为什么我必须使用下划线(_.each)来定位模型?

时间:2014-02-14 01:57:23

标签: javascript backbone.js underscore.js

因此,每当我想从我的收藏中选择一个模型时,我总是使用骨干自己的where方法。

var homeTeam = this.collection.where({teamName: this.currentTeamName('home')});

我有自己的方法来抓住当前的团队,我将“家”或“离开”作为参数传递,并且它知道要抓住哪个模型,这一切都很好,花花公子,另一个例子就是通过一个字符串如下。

// This is practically the same as the above.
var homeTeam = this.collection.where({teamName: 'bulls'});

因此,如果我记录该变量console.log(homeTeam),则控制台会显示该模型,就像它对任何模型一样。

控制台显示我可以访问模型可以使用http://backbonejs.org/#Model的常规方法但是如果我调用其中一种方法我会收到错误,ex homeTeam.save({someAttr: 'juicy'});

所以我只使用下面的下划线each方法,它可以工作。

_.each(homeTeam, function(model) { model.save({someAttr: 'juicy'}); }, this);

我已经这样做了一段时间,但我很想知道为什么我必须这样做,当记录homeTeam它通过模型就像

_.each(homeTeam, function(model) { console.log(model) }, this); 

它们在控制台中显示完全相同。

3 个答案:

答案 0 :(得分:1)

因为where会返回数组模型。该数组不是模型对象。这是一个数组。

请参阅source

答案 1 :(得分:1)

啊,我想我在这里看到了问题。

.where返回一个数组;即使它是一个Model数组,Javascript控制台也会将该条目作为模型进行评估,以便您可以看到Backbone提供的方法。

您需要做的是使用.findWhere。

这将返回第一个匹配的模型,作为正确输入的对象。

或者你可以尝试(只是为了证明)'homeTeam [0] .save(...)

澄清一下:你收到错误是因为homeTeam不是你想象的那样;欢迎来到Javascript!

答案 2 :(得分:1)

假设team.teamName是唯一的,您可以安全地使用.findWhere,它会从您的集合中返回单个模型,而不是返回模型数组的.find

来自underscore docs

  

<强> findWhere   查看列表并返回与属性中列出的所有键值对匹配的第一个值

而不是

  

<强> where   查看列表中的每个值,返回包含属性中列出的所有键值对的所有值的数组