2012-09-30 322 views
0

當我從服務器獲取模型或集合時,我無法訪問該模型的屬性,除非我將其進行字符串化然後重新解析。據推測,這些模型本身有一些來自backbone.js的額外開銷?請注意,在下面的代碼中,我可以按順序執行stringify/parse,這應該與我開始時的結果相同。但是,顯然我已經通過執行這兩個步驟殺掉了一些多餘的信息,因爲我的模型的屬性現在與以前有所不同。當然,我不需要通過這兩個步驟來訪問我的模型屬性,對吧?backbone.js模型和集合開銷

Eg. 
thismodel = /// assume this came from server fetch 
alert(thismodel.name); // DOES NOT WORK - undefined 

jsonmodel = JSON.stringify(thismodel); 
var providerprefslistJSON = jQuery.parseJSON(jsonmodel); 
alert(providerprefslistJSON.name);  // WORKS 

回答

1

骨幹模型對象不是普通的舊JavaScript對象。他們保留在an internal hash的屬性。要訪問name屬性,你可以這樣做:

alert(thismodel.attributes.name);

或者更好的使用the get() method

alert(thismodel.get("name"));

它的工作原理的原因,當你再次轉換模型,JSON,然後是因爲JSON.stringify調用the toJSON() method,它創建一個來自的JSON字符串的內部屬性hash,這意味着當你解析該字符串時你會得到一個普通的舊Java腳本對象 - 與Backbone Model對象不同。

0

首先,你是否試圖訪問模型或響應的屬性?

alert(thismodel.name)這似乎是你要爲模型的屬性而不是屬性。如果你正在尋找模型屬性,那麼也許你想alert(this.model.get('name'))

如果你確實要model.name,那麼基本上問題可能在於你如何解析數據。舉例來說,服務器中的JSON就像這樣{'name':'Jimmy'}。

雖然model.response發送的原始JSON在object.name下具有「Jimmy」命名空間,但Backbone會自動接受並將其轉換爲模型屬性,除非另有指示(例如,modelObj.attributes.name)使用get()函數。

如果一切正常,您應該能夠相當簡單地訪問模型數據。

E.g.取回

var model = new MyModel(); 
    model.id = 1; 
    model.fetch({ 
     success: function(model, response) { 
      console.log(model.get('name')); // The model name attribute 
      console.log(response.name); // The RAW response name property 
     } 
    }); 

或者也許你的服務器沒有發回數據作爲JSON數據。服務器響應是content-type="application/json"

有些事情要檢查。