2012-01-16 112 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)) . "; ";