2012-10-24 81 views
0

我有問題同步從服務器接收的JSON數據與我的意見後提取。骨幹意見不能與提取json

我沒有「mainmodel」的集合,因爲我只用一個「mainmodel」在時間,但衆多「爲MyModel」工作,無論如何,結構如下:

var mymodel = Backbone.Model.extend({ 
     defaults: {k1:"", 
        k2:"", 
        k3:""} 
    }); 

    var collection = Backbone.Collection.extend({model:mymodel,}); 

    var mainmodel = Backbone.Model.extend({ 
     defaults: {v1:"", 
        v2:"", 
        v3:"", 
        v4:new collection() 
    }); 

創建父視圖中渲染函數的「mymodel」的嵌套視圖。這隻有在我使用新模型時纔有效。

// My ParentView render function 
render: function() { 
for (var i = 0; i < this.model.v4.length;i++) { 
    var view = new MyModelView({model:this.model.v4.at(i)}); 
    this.$el.append($(view.render().el)); 
} 
this.$el.append(this.template(this.model.toJSON())); 
return this; 
}, 

// The MyModelView render function below 
render: function() { 
    this.$el.html(this.template(this.model.toJSON())); 
return this; 
}, 

現在,上述工程,如果我打開我的應用程序,並從那裏創建模型。但是,如果我打開我的應用程序並提供一個id,我將對服務器進行讀取,檢索數據,然後創建一個新的ParentView,最終得到一個錯誤,指出「this.model.v4.at不是函數」。啊。

所以,現在,如果我改變第一渲染功能是,在(I)改變爲[I]

var view = new MyModelView({model:this.model.v4[i]}); 

並更改第二渲染功能,刪除的toJSON,是:

this.$el.html(this.template(this.model)); 

它呈現。但是我仍然無法繞過視圖而沒有錯誤。沒有驚喜。我已經使用console.log(JSON.stringify(this.model));當他們到達parentView和MyModelView。返回的JSON看起來像這樣,無論是獲取還是創建。

{"v1":"val1", 
    "v2":"val2, 
    "v3":"val3", 
    "v4":[{"k1":"key1","k2":"key2","k3","key"}, { ... }, { ... }] 
    } 

JSON數據結構看起來是相同的。我認爲JSON格式不正確,所以我在將模型交給視圖之前嘗試使用JSON.parse,但這並不起作用。也許我很興奮,但我原本以爲我有一個JSON格式問題,但現在我不知道。服務器將內容作爲「application/json」返回。

編輯:v1,v2,v3的JSON值正確呈現。

任何想法?

回答

3

你有兩個問題:一個你知道,一個你不知道。

您知道的問題是,您的mainmodel不會自動將您的v4 JSON轉換爲集合,因此最終會得到您期待集合的數組。

parse: function(response) { 
    if(response.v4) 
     response.v4 = new collection(response.v4); 
    return response; 
} 

的問題,你不知道的是,你在mainmodeldefaults有一個隱藏的參考共享問題:您定義

var mainmodel = Backbone.Model.extend({ 
    defaults: { 
     //... 
     v4: new collection() 
    } 
}); 

任何你可以通過添加parsemainmodel解決這個問題在Backbone.Model.extend對象中最終會出現在您模型的原型上,因此整個defaults對象將被模型的所有實例共享。另外,Backbone將在您的新模型中做一個defaults的淺拷貝。所以如果你m1 = new mainmodel()m2 = new mainmodel(),那麼m1m2將具有完全相同的v4屬性。您可以使用defaults的功能解決此問題:

var mainmodel = Backbone.Model.extend({ 
    defaults: function() { 
     return { 
      v1: '', 
      v2: '', 
      v3: '', 
      v4: new collection() 
     }; 
    } 
}); 
+0

就是這樣!現在工作很好。謝謝! – fbynite

+0

很好的答案,謝謝! –