6

我不知道为什么,但我无法让它工作。

var friends = new Backbone.Collection([
  {name: "Athos",      job: "Musketeer"},
  {name: "Porthos",    job: "Musketeer"},
  {name: "Aramis",     job: "Musketeer"},
  {name: "d'Artagnan", job: "Guard"},
]);

friends.where({job: "Musketeer"}).toJSON()

我得到Uncaught TypeError: Object [object Object] has no method 'toJSON'

我做错了什么,如何将过滤后的集合转换为 JSON?

4

2 回答 2

15

Underscore.where方法返回的Array不是 aBackbone.Collection所以它没有toJSON定义方法。

所以你可以做两件事:

迭代元素并映射结果:

var result = friends.where({job: "Musketeer"});
_.map( result, function( model ){ return model.toJSON(); } );

jsFiddle 代码

实现一个返回正确 Backbone.Collection 的 Collection 搜索器方法:

var Friends = Backbone.Collection.extend({
    search: function( opts ){
        var result = this.where( opts );
        var resultCollection = new Friends( result );

        return resultCollection;
    }
});

var myFriends = new Friends([
  {name: "Athos",      job: "Musketeer"},
  {name: "Porthos",    job: "Musketeer"},
  {name: "Aramis",     job: "Musketeer"},
  {name: "d'Artagnan", job: "Guard"},
]);

myFriends.search({ job: "Musketeer" }).toJSON();​

jsFiddle 代码

于 2012-05-11T09:48:17.993 回答
5

toJSON是一个令人困惑的方法名称:http ://documentcloud.github.com/backbone/#Collection-toJSON

toJSON collection.toJSON()

返回一个数组,其中包含集合中每个模型的属性哈希。这可用于序列化和>持久化整个集合。这个方法的名字有点混乱,因为它符合 JavaScript 的 >JSON API。

如果要将集合转换为 JSON 字符串,请使用JSON.stringify

var friends = new Backbone.Collection([
  {name: "Athos",      job: "Musketeer"},
  {name: "Porthos",    job: "Musketeer"},
  {name: "Aramis",     job: "Musketeer"},
  {name: "d'Artagnan", job: "Guard"},
]);

JSON.stringify( friends.where({job: "Musketeer"}) );

请注意,where返回一个数组,而不是 Backbone 集合,您必须构建一个新集合才能使用该toJSON方法。

于 2012-05-11T09:37:21.663 回答