2013-08-25 2 views
0

Я пытаюсь разобрать данные в виде коллекции из json-файла, который имеет номер ключа для каждой группы данных внутри него. JSON выглядит следующим образом:Backbone Js - проблема с данными синтаксического анализа

{ 
    "0": { 
     "artifact_id": "36", 
     "timestamp": "2013-08-20 11:59:00", 
     "modified": "2013-08-20 11:59:00", 
     "text": "Why did the last one duplicate? I don't think I clicked it twice...", 
     "author_desc": "", 
     "object_type": "artifact", 
     "comments": [] 
    }, 
    "1": { 
     "artifact_id": "35", 
     "timestamp": "2013-08-20 11:57:51", 
     "modified": "2013-08-20 11:57:51", 
     "text": "This is a new artifact for a new day.", 
     "author_desc": "", 
     "object_type": "artifact", 
     "comments": [] 
    }, 
    "2": { 
     "artifact_id": "34", 
     "timestamp": "2013-08-20 11:57:50", 
     "modified": "2013-08-20 11:57:50", 
     "text": "This is a new artifact for a new day.", 
     "author_desc": "", 
     "object_type": "artifact", 
     "comments": [] 
    } 
} 

Как написать модель разобрана, чтобы взять каждую из записей (0, 1, 2 ... и т.д.), поскольку каждая модель из данных?

Это моя коллекция, с предложенным добавлением от Кейси ниже, однако это не кажется, должен быть запущен метод синтаксического анализа:

var FriendCollection = Backbone.Collection.extend({ 
    model: FriendModel, 
    parse: function(data) { 
     console.log('running parse'); 
     return _.map(data, _.identity); 
    } 
}); 
var friendCollection = new FriendCollection(); 
friendCollection.reset(friendjson); 
+0

collection.parse запускается только при извлечении из сервера. http://backbonejs.org/#Collection-parse –

ответ

2

Collection#reset не вызывает parse и нет никакого способа, чтобы сделать его называют parse. У вас есть несколько вариантов:

  1. Преобразовать friendjson в массив вручную и дают reset, что массив.
  2. Не делайте reset, просто введите friendjson в конструктор коллекции и включите {parse: true} option.
  3. Замените свою коллекцию reset своей собственной версией, которая вызывает parse, если вы включили опцию {parse: true}.

должно быть довольно очевидно.

будет выглядеть следующим образом:

var friendCollection = new FriendCollection(friendjson, { parse: true }); 

Демо: http://jsfiddle.net/ambiguous/dbM82/

будет выглядеть примерно так:

var FriendCollection = Backbone.Collection.extend({ 
    //... 
    reset: function(models, options) { 
     if(options && options.parse) { 
      delete options.parse; 
      models = this.parse(models); 
     } 
     return Backbone.Collection.prototype.reset.call(this, models, options); 
    } 
}); 

var friendCollection = new FriendCollection(); 
friendCollection.reset(friendjson, { parse: true }); 

Демо: http://jsfiddle.net/ambiguous/Rs8es/

+0

Спасибо @mu слишком коротко, что и сделал. Благодарим вас за подробное объяснение. – flashpunk

+0

Или, если это особенное обстоятельство, вы можете вызвать функцию разбора напрямую: 'friendCollection.reset (friendCollection.parse (friendjson))' – mnoble01

0

Используйте метод Collection#parse.

var MyCollection = Backbone.Collection.extend({ 
    parse: function (data) { 
    return _.map(data, _.identity); 
    } 
}); 
+0

Спасибо @Casey Фостер, похоже, не работает. Кажется, что метод разбора не вызван. Я добавил код коллекции в исходное сообщение выше. – flashpunk

+0

Я предположил, что вы вызываете 'fetch' для получения этих данных. Поскольку вы используете 'reset', вам нужно передать параметр' parse: true'. 'friendCollection.reset (friendjson, {parse: true});' –

+0

Я хотел бы иметь возможность использовать выборку, но я не могу заставить ее работать ... Я пытаюсь работать до это, используя данные таким образом в первую очередь. В любом случае, бег friendCollection.length по-прежнему только возвращает 1 к сожалению. – flashpunk

Смежные вопросы