2013-02-04 21 views
0

我有一個模型,擴展Backbone.RelationalModel並且有一對多的關係,當我嘗試發送一個帶有該模型的ajax請求作爲參數時,會發生問題。Send BackboneRelational as ajax data

$.ajax(
     url: 'save' 
     type: 'POST' 
     data: 
      project: MyApp.project 
    ) 

我收到以下錯誤 Uncaught TypeError: Cannot read property '_permitsAvailable' of undefined它命名爲acquire 誰能告訴我這是爲什麼發生的方法發生?

編輯:

挖掘錯誤的原因後,我發現,jQuery.param功能定義add(key, value)功能,在某些時候這value屬性爲acquire功能,這個功能就沒有這一點,所以我得到的錯誤,我不知道爲什麼Backbone.RelationalModel的_queue被序列化?

回答

0

我不知道爲什麼會發生這種情況。以下是一些可幫助您解決問題的信息:

acquire方法屬於Backbone.Semaphore的一部分,該方法是用於Backbone.Relational中的隊列和併發管理的混合。信號混合混入幾個不同的類別,包括RelationalModel

私有_permitsAvailable屬性只能在mixin本身內訪問,使用this._permitsAvailable。您的錯誤消息告訴您發生錯誤,因爲this未定義。只有在使用Function.callFunction.apply執行方法時纔會發生這種情況。

編輯:問題似乎是,jQuery試圖通過迭代它的每個屬性來序列化模型,並且如果該屬性是一個函數,則調用該函數並序列化其返回值。這對於骨幹模型來說是不可行的,因爲數據屬性實際上並不在模型對象上,而是存儲在Model.attributes屬性中。

此問題應使用Model.toJSON方法的模型對象轉換爲一個更系列化友好的格式來容易地固定:

$.ajax(
    url: 'save' 
    type: 'POST' 
    data: 
    project: MyApp.project.toJSON() 
) 

Model.toJSON documentation引用:

返回的副本JSON字符串化的模型屬性。這可以在發送到服務器之前用於持久性,序列化或擴充。這個方法的名字有點混亂,因爲它實際上並沒有返回JSON字符串 - 但我擔心這是JSON.stringify的JavaScript API的工作方式。

您還必須確保在reverseRelation骨幹關係includeInJSON選項設置爲false,以避免在您model.attributes序列化的相關車型。

+0

你是對的,函數被調用時沒有'jQuery.param'函數的上下文,我給這個問題添加了一些信息。 – Khaled

+0

@Khaled,編輯了答案。 – jevakallio

+0

謝謝我不得不從屬性中刪除模型,因爲我使用的是骨幹關係,如果您不介意的話,我會將其添加到您的答案中。 – Khaled