2013-10-09 65 views
0

我想解析一個多級json文件,創建一個模型,然後將該模型添加到骨幹集合,但我似乎無法弄清楚如何將模型推送到集合。這應該是一個很容易解決的問題,我似乎無法弄清楚。在此先感謝您的幫助。以下是我的模型和收集代碼:無法添加解析的JSON到骨幹集合

var Performer = Backbone.Model.extend({ 

defaults: { 
    name: null, 
    top5 : [], 
    bottom5 : [] 
}, 
initialize: function(){ 
    console.log("==> NEW Performer"); 

    // you can add event handlers here... 


} 
}); 

var Performers = Backbone.Collection.extend({ 

url:'../json_samples/performers.json', 
model:Performer, 
parse : function(data) { 
    // 'data' contains the raw JSON object 
    console.log("performer collection - "+data.response.success); 

    if(data.response.success) 
    { 
     _.each(data.result.performers, function(item,key,list){ 
      console.log("running for "+key); 
      var tmpObject = {}; 
      tmpObject.name = key; 
      tmpObject.top5 = item.top5; 
      tmpObject.bottom5 = item.bottom5; 
      var tmpModel = new Performer(tmpObject); 
      this.models.push(tmpModel); 
     }); 

    } 
    else 
    { 
     console.log("Failed to load performers"); 
    } 
} 

});

+1

是什麼'data.result.performers'樣子?你覺得'this'在'_.each'回調中呢?永遠不要修改集合的「模型」屬性,您將使集合處於不一致狀態,使用集合的方法來添加新模型。 –

+0

對於mu說的同樣,但也不是'parse'需要工作的方式是將數據結構作爲參數並返回不同的結構作爲返回值。它根本不應該使用'this'。爲了修正你的'parse'代碼,我們需要看到'data.result.performers'數據的一個樣本,因爲你的代碼只是把它當作一個對象,而把它當作一個對象數組來對待。 –

+0

明白了,我剛剛使用了var這個技巧,並解決了這個問題。我試圖推動模型,因爲正常this.push不工作,現在我知道爲什麼。謝謝! –

回答

1

正如您在對您的問題的評論中所述,parse()不打算以這種方式使用。如果data.results.performersArray,您所要做的就是返回它。在你的情況下,代碼會稍有不同。

var Performers = Backbone.Collection.extend({ 
    ... 
    parse: function(resp, options) { 
     return _.map(resp.result.performers, function(item, key) { 
      return _.extend(item, {name: key}); 
     }); 
    } 
    ... 
}); 

在諮詢方面,如果你需要更改API服務器端的機會,你可能會更好治療對象作爲數組的集合,而不是作爲對象。即使通過某個ad-hoc密鑰訪問對象有時很方便,數據實際上也是一個數組。

您可以稍後改變它時,你需要表演者按姓名與像函數下劃線的IndexBy