2013-02-10 73 views
2

我有一個鏈接到兩個子型號,像這樣一個模型:Backbone.js的 - 重寫解析()不設置模型屬性

var SubModel = Backbone.Model.extend({ 
    defaults: { 
     headline: null, 
     image_url: null, 
     url: null 
    } 
}); 

var MainModel = Backbone.Model.extend({ 
    defaults: { 
     subModelA: null, 
     subModelB: null, 
     title: null 
    }, 

    urlRoot: function() { 
     if (this.isNew()) { 
      return '/mainmodel/new'; 
     } 
     return '/mainmodel'; 
    }, 

    initialize: function() { 
     this.fetch(); 
    }, 

    parse: function(data) { 
     var response = {}; 
     response.subModelA = new SubModel(data.subModelA); 
     response.subModelB = new SubModel(data.subModelB); 
     response.title = data.title; 
     return response; 
    } 
}); 

我目前遇到的問題是,調用var mainModelInstance = new MainModel()不正確取自/mainmodel/new,但mainModelInstance.attributes始終是空白對象{}

var mainModelInstance = new MainModel(); 
mainModelInstance.attributes; // Returns {} 

這裏是服務器的響應來/mainmodel/new樣本:

{ 
    "title": "Politics", 
    "subModelA": { 
     "headline": "Investigators: Iran tried to smuggle suicide belts, missiles by boat into Yemen", 
     "url": "http://dailycaller.com/2013/02/09/yemen-minister-says-weapons-came-from-iran/", 
     "image_url": "http://cdn01.dailycaller.com/wp-content/uploads/2013/02/54c7d52e1a384db489ab9ea568afddb0-e1360455589316.jpg" 
    }, 
    "subModelB": { 
     "headline": "Review: Who needs Windows RT? Acer's Iconia W510 runs the real thing", 
     "url": "http://arstechnica.com/gadgets/2013/02/review-who-needs-windows-rt-acers-iconia-w510-runs-the-real-thing/", 
     "image_url": "http://cdn.arstechnica.net/wp-content/uploads/2013/02/w510-main-640x388.jpg" 
    } 
} 

它好像模型的屬性不被通過parse更新。爲什麼不更新模型的屬性?

+1

不知道您的問題的確切答案,但是2個快速註釋:小心像MainModel的'subModelA'和'subModelB'這樣的模型實例屬性與模型數據屬性不同,所以試圖通過解析來建立它們不會設置它們直接作爲instan ce屬性,只是屬性哈希。此外,就REST約定而言,您的代碼很奇怪。您應該通過model.save創建新模型,而不是通過POST獲取並且不通過GET。 – 2013-02-10 04:54:46

+0

到目前爲止,我猜,你需要從parse()方法返回json。不要在那裏做任何事情。 – HungryCoder 2013-02-10 04:54:47

+0

@PeterLyons這不是一個典型的REST場景。沒有初始狀態的'MainModel'由默認值填充,並且沒有等效的CREATE,UPDATE或DELETE方案。這個模型會有一個自定義的方法,可以有效地記錄'subModelA'或'subModelB'之間的選擇。 'MainModel'代表了各種各樣的'匹配'。 – 2013-02-10 05:13:59

回答

6

您的代碼很可能會成爲工作,但你不能正確測試它

要調用this.fetch在YOUT初始化方法。 調用model.fetch是異步調用,當您嘗試評估mainModelInstance.attributes時,http請求調用尚未完成。

你應該測試:

var mainModelInstance = new MainModel(); 
mainModelInstance.on('change', function() { 
    console.log(mainModelInstance.toJSON()); 
}); 

,甚至更好,不要自動(反正它不是一種最佳實踐)取上initialize 和使用jQuery的承諾的模式:

var mainModelInstance = new MainModel(); 
mainModelInstance.fetch().done(function() { 
    console.log(mainModelInstance.toJSON()); 
}); 
1

首先,默認的屬性值必須投入defaults選項,就像這樣:

var SubModel = Backbone.Model.extend({ 
    defaults: { 
    headline: null, 
    image_url: null, 
    url: null 
    } 
}); 

然後,你就必須創造價值的一個新的實例時保存到服務器。這也將填滿你的mainModelInstance.attributes散列。

對於解析問題,您是否記錄了(console.log)從服務器獲取的內容?

+0

我有和答覆是有效的https://gist.github.com/msukmanowsky/a41d8502332df0f02803 – 2013-02-10 05:03:31

+0

是啊..我沒有任何具體的補充,但在這裏做了一個jsBin。你擊敗了我的答案:)重寫'同步'作爲演示工作。 http://jsbin.com/ayaxey/1/edit – 2013-02-10 05:06:31

+0

這是不正確的。默認屬性是可選的,僅用於設置初始值。 http://backbonejs.org/#Model-defaults – 2013-02-10 07:39:20

3

這只是一個正在進行的工作答案,請隨時在評論中討論。

我會改變你的MainModel定義,就像這樣:

subModelA: new SubModelA(), 
subModelB: new SubModelB(), 
parse: function(data){ 
    this.subModelA.set(data.subModelA); 
    this.subModelB.set(data.subModelB); 
    return data; // we keep two copies of the data, in mainModel and submodels. 
} 

因此,假設您的服務器響應酷似你的答案

var model = new MainModel(); 
model.get('title'); // Politics 
model.subModelA.get('headline'); // Investigators: Iran tr... 

然後,你可能必須替換取決於如何保存方法你希望把東西留在服務器上 - 這可能會起作用。

save: function(key, val, options) { 
    this.set({ 
    subModelA: this.subModelA.toJSON(), 
    subModelB: this.subModelB.toJSON() 
    }); 
    Backbone.Model.prototype.save.apply(this, arguments); 
} 
+0

當然,你可能會發現自己重寫其他方法,比如'''update'''。那麼這就引發了這個問題,你需要多個模型? – 2013-02-10 05:59:28

+0

我一定在考慮刮這個子模型。最大的好處是打破了視圖模板,但它可能更有害無益。感謝你的回答!原來我的解析實現一直在工作,但由於'fetch()'是異步的,所以我期待'model.attributes'被更新,所以我太早跳過了槍。 – 2013-02-10 15:32:05

相關問題