Вопрос по – toJSON на Backbone.Collection # где?

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?

Ваш Ответ

2   ответа
15

Что заUnderscore.where метод возвращаетArray неBackbone.Collection так что не имеетtoJSON метод определен.

Таким образом, вы можете сделать две вещи:

Iterate over elements and map the result:

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

код jsFiddle

Implement a Collection searcher method that returns a proper 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();​

код jsFiddle

5

toJSON сбивает с толку название метода:http://documentcloud.github.com/backbone/#Collection-toJSON

toJSON collection.toJSON()

Return an array containing the attributes hash of each model in the collection. This can be used to serialize and >persist the collection as a whole. The name of this method is a bit confusing, because it conforms to JavaScript's >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 метод.

Похожие вопросы