2012-01-16 90 views
16

我正在尝试将JSON(从php的json_encode)加载到Backbone 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

类似的问题: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

是的,如果数据是使用类似jquery的$ .getJSON方法检索的,它会自动调用JSON.parse。 – 2012-01-16 06:39:14

+1

该文档至少在一个示例中显示直接传递json到初始化:http://documentcloud.github.com/backbone/#Collection-toJSON(即使此演示的目的是如何导出json) – pws5068 2012-01-16 08:35:56

+1

请注意,他们没有提及它们传递给集合构造函数的数组已经被解析。该文档可能在那里稍作澄清,但需要记住的是JSON通常以字符串格式在服务器和客户端之间传递,并且需要在发送之前在接收或字符串化之后进行解析。 – kinakuta 2012-01-16 08:54:01

3

您忘记了模型中的defaults散列。

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

documentation

+0

啊,我是太专注于版本如果使用JSON结构,我错过了这个简单的排除。感谢您的帮助 – pws5068 2012-01-16 06:28:59

+3

默认值散列是可选的 – kinakuta 2012-01-16 06:33:33

+0

@kinakuta是,默认散列是可选的,但示例中的模型试图使用没有散列的默认功能。 – Paul 2012-01-16 15:08:47

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)) . "; ";