在Backbone.Collection上的toJSON#where?

Lin*_*der 6 backbone.js

我不知道为什么,但我不能让这个工作.

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()
Run Code Online (Sandbox Code Playgroud)

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

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

fgu*_*len 15

Underscore.where方法返回的是Array不是Backbone.Collection因为它没有toJSON定义方法.

所以你可以做两件事:

迭代元素并映射结果:

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

jsFiddle代码

实现一个Collection搜索器方法,返回一个合适的Backbone.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();?
Run Code Online (Sandbox Code Playgroud)

jsFiddle代码


nik*_*shr 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"}) );
Run Code Online (Sandbox Code Playgroud)

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