我确定我犯了其中一个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);
答案 0 :(得分:3)
这是因为filter
返回了一组模型。并且javascript中的数组没有toJSON
函数。
由于您想要返回模型而不是数组,因此您可以使用find
代替filter
。 find方法返回匹配条件的第一个模型
这是代码的样子:
getProductByName: function(productName) {
return this.find(function(production) {
return production.get('name') === productName;
});
}