2012-01-16 3 views
16

Я пытаюсь загрузить JSON (из json_encode php) в коллекцию JS Backbone. Я упростил задачу:Магистраль: создать коллекцию из JSON

var myJSON = '[{ "id":"1","name":"some name","description":"hmmm"}]'; 

var myCollection = new MyCollection(myJSON, { view: this }); 

И:

MyObject = Backbone.Model.extend({ 

    id: null, 
    name: null, 
    description: null 
}); 

MyCollection = Backbone.Collection.extend({ 
model: MyObject, 
initialize: function (models,options) { } 
}); 

Ошибка:

Uncaught TypeError: Cannot use 'in' operator to search for 'id' in

Похожие Issue: Backbone: fetch collection from server

Моя JSON, конечно, по-видимому, в правом формат, я пропущу что-то очевидное? Я попытался использовать просто id: «1», а не «id» с тем же результатом.

ответ

13

Ваш JSON еще в строковом формате. Передайте его JSON.parse перед назначением его:

var myJSON = JSON.parse('[{"id":1,"name":"some name","description":"hmmm"}]'); 
+1

Да, и если данные извлекаются с использованием чего-то вроде метода $ .getJSON jquery, он будет автоматически называть JSON.parse. –

+1

Документация действительно показывает pass json непосредственно на инициализацию по крайней мере в одном примере: http://documentcloud.github.com/backbone/#Collection-toJSON (хотя цель этой демонстрации заключается в том, как экспортировать json) – pws5068

+1

Обратите внимание, что они не упоминают, что массив, который они передают в конструктор коллекции, уже проанализирован. Документация может, вероятно, содержать небольшое пояснение, но помнить, что JSON обычно передается между сервером и клиентом в строчном формате и нуждается в анализе после получения или стрификации перед отправкой. – kinakuta

3

Вы забыли свой хэш-код defaults в своей модели.

MyObject = Backbone.Model.extend({ 
    defaults: { 
    id: null, 
    name: null, 
    description: null 
    } 
}); 

См documentation

+0

Ах, я был так сосредоточен на вер Искушая структуру JSON, я пропустил это простое исключение. Спасибо за помощь. – pws5068

+3

defaults hash не является обязательным. – kinakuta

+0

@kinakuta yep, хэш по умолчанию не является обязательным, но модель в примере пыталась использовать функциональность по умолчанию без хэша. – Paul

0

так что я, может быть полностью отсутствует пункт, но проблемы, кажется, что «одиночные кавычки» вокруг массива. То есть, это:

var myJSON = '[{ "id":"1","name":"some name","description":"hmmm"}]'; 

должно быть:

var myJSON = [{ "id":"1","name":"some name","description":"hmmm"}]; 

Php, Afik, не добавляет одинарные кавычки, так что это должно быть так же просто, как изменение линии, которая говорит:

$my_js = "var myJSON = '" . json_encode($my_array_to_send)) . "';"; 

к:

$my_js = "var myJSON = " . json_encode($my_array_to_send)) . "; "; 
Смежные вопросы