2012-08-08 137 views
0

我敢肯定,我犯了这些Backbone新手错误之一,但经过一个小时的搜索,我没有找到解决方案。如何从Backbone集合中获取有效的过滤模型?

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

但是,如果我将过滤器方法更改为一个简单的“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); 

回答

3

这是因为filter返回的车型阵列。而javascript中的数组没有toJSON函数。

既然您想要返回一个模型而不是数组,那么您可以使用find来代替filter。这一发现方法返回的标准

下面的代码是什么样子匹配的第一个模型:

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

感谢@muistooshort,我更新了我的答案,以反映您的建议 – Paul 2012-08-08 20:10:06

相关问题