如何从Backbone Collection获取有效的过滤模型?

时间:2012-08-08 18:27:02

标签: backbone.js

我确定我犯了其中一个Backbone新手错误,但经过一个小时的搜索后,我没有找到解决方案。

问题在于:当我尝试从我的集合中获取过滤模型时,会出现类型错误“productCollection.getProductByName(”M020012“)。toJSON不是函数”。

但是如果我将过滤方法改为简单的“return this.at(0)”,我会得到一个有效的模型。

为什么会这样,解决方案是什么?

这是JSFiddle

var products = [{
    "name": "M020013",
    "gender": "M",
    "pictures": [{
        "picture": {}}]},
{
    "name": "M020012",
    "gender": "M",
    "pictures": [{
        "picture": {}}]},
{
    "name": "M020011",
    "gender": "M",
    "pictures": [{
        "picture": {}}]}
];

var Product = Backbone.Model.extend({});

var ProductCollection = Backbone.Collection.extend({
    model: Product,
    getProductByName: function(productName) {
        //return this.at(0);

        return this.filter(
            function(product) {
            return product.get('name') === productName;
        });
    }
});

var productCollection = new ProductCollection();

productCollection.on('reset', function() {
    console.log('reset');
    console.log(productCollection.getProductByName('M020012'));
    console.log(productCollection.getProductByName('M020012').toJSON());
});

productCollection.reset(products);

1 个答案:

答案 0 :(得分:3)

这是因为filter返回了一组模型。并且javascript中的数组没有toJSON函数。

由于您想要返回模型而不是数组,因此您可以使用find代替filter。 find方法返回匹配条件的第一个模型

这是代码的样子:

getProductByName: function(productName) {
  return this.find(function(production) {
    return production.get('name') === productName;
  });
}