2011-08-22 55 views
3

我的JSON數據: -ExtJS的4問題,努力做更新的深度嵌套的JSON數據

{ 
    "attributes": { 
     "list": [ 
     { 
      "name":"attribute2", 
      "value":"attribute2 value" 
     }, { 
      "name":"attribute1", 
      "value":"attribute1 value" 
     }] 
    } 
    "name":"name1", 
    "id":1234 
} 

我的商店定義: -

Ext.define('Attr', { 
    extend: 'Ext.data.Store', 
    model: 'Attribute', 
    autoLoad: true, 

    proxy: { 
     type: 'rest', 
     url: 'data/1234', 
     api: { 
      update: 'newdata/1234' 
     }, 
     reader: { 
      type: 'json', 
      root: 'attributes.list' 
     } 
    } 
}); 

我的模型定義: -

Ext.define('Attribute', { 
    extend: 'Ext.data.Model', 

    fields: ['name','value'] 
}); 

用於顯示上述商店的視圖: -

{ 
    xtype: 'grid', 
    store: 'Attr', 
    id: 'attrpanel', 
    columns: [ 
    { 
     header: 'Name', 
     sortable: true, 
     dataIndex: ['name'], 
     flex: 1 
    }, { 
     header: 'Value', 
     sortable: true, 
     dataIndex: ['value'], 
     flex: 1 
    }] 
} 

現狀:我可以顯示來自Json對象的數據值。

問題:每當我編輯的字段後,在我的控制器調用this.getAttrStore()同步(),我得到一個錯誤。 我已經通過論壇的數量進行了搜索,並意識到在更新深度嵌套的JSON數據時似乎存在一些問題。

我曾想過讓彼得穆勒的補丁,但我沒有真正給那一槍。

請糾正我,如果我錯了,或者如果你能指向我有用的東西,這將是一個很大的幫助。

非常感謝!

回答

0

你會得到什麼錯誤? 您是否在HTTP請求之前或之後發生此錯誤? 服務器發送的響應是什麼?

無論如何,我建議爲你的代理配置一個編寫器。

+0

感謝您的快速回復Bruni! 我點擊「保存按鈕」後會出現一個錯誤,該保存按鈕會在彈出窗口中打開。在「控制器」裏面,「click save button」動作事件會執行「this.getAttrStore()。sync()」,這會給我一個405錯誤。 問題是,與非嵌套Json一起使用時,上面的函數完全相同,即我能夠更新我的Json。 請告訴我,如果我能夠正確解釋自己。 就寫作者而言,我配置了一個與讀者相同的根,它也給了我相同的405錯誤。 這可能是一個REST服務問題? –

+0

HTTP錯誤405 =方法不允許,所以在服務器端似乎有問題 –

+0

服務器期望接收的內容與接收的內容可能不匹配。您的客戶端發送給服務器的JSON無法映射到服務器端的模型。經歷了嵌套數據的相同問題原因。 – levivanzele

1

我有同樣的問題,並使用來自Sencha forums by beachdog的解決方案結束。 他用一個覆蓋在保存前的相關數據適用於記錄:

Ext.define('custom.JsonWriterOverride', { 
    override: 'Ext.data.writer.Json', 

    getRecordData: function(record) { 
      Ext.apply(record.data,record.getAssociatedData()); // <-- 
      return record.data; 
    } 
}); 

然後你可以使用覆蓋作爲一項要求在你的模型,如下所示:

Ext.define('My.model.Query', { 
    extend: 'Ext.data.Model', 

    requires: ['custom.JsonWriterOverride'], // <-- 
... 
    proxy: { 
     type: 'rest', 
     url: 'webApp/query.do', 
     reader: { 
      type: 'json', 
      root: 'data' 
     }, 
     writer: { 
      type: 'json', 
      writeAllFields: true 
     } 
    } 
}); 

恕我直言,一個優雅和直接的解決方案;所有學分去海灘狗。