如何让ExtJS JsonStore将JSON数据直接放入请求体?

时间:2010-05-27 23:35:23

标签: json serialization extjs

我有一个像这样配置的JsonStore:

var store = new Ext.data.JsonStore({
    restful: true,
    url: '/categories',
    remoteSort: true,
    idProperty: 'Id',
    totalProperty: 'total',
    root: 'results',
    writer: new Ext.data.JsonWriter({
        encode: false
    }),

    fields: [ 'Id', 'Name' ]
});

我从服务器获取一些数据,然后编辑其中一条记录。当我告诉商店保存时,它会将此JSON发送回服务器:

{
    "results":
    {
        "Name":"Trivial123",
        "Id":2
    }
}

商店将JSON包装在results属性(商店中配置的root属性)中。但是,服务器期望这样:

{
    "Name":"Trivial123",
    "Id":2
}

换句话说,序列化实体应该直接放在响应主体中,而不是包含在属性中。有谁知道如何配置商店来做到这一点?

2 个答案:

答案 0 :(得分:3)

您需要覆盖JsonWriter中的数据呈现功能,如下所示:

var rootlessRenderFunction = function (params, baseParams, data) {
   if (this.encode === true) {
      Ext.apply(params, baseParams);
      params = Ext.encode(data);
   } else {
      params.jsonData = data;
   }
};

var myWriter = new Ext.data.JsonWriter({
   encode: false,
   writeAllFields: true
});
myWriter.render = rootlessRenderFunction;

var myStore = new Ext.data.JsonStore({
   // ... various config values ...
   writer: myWriter
});

这个“rootlessRenderFunction”实现与Ext JsonWriter的渲染代码相同,只是它没有在请求数据中插入根。

当然,这是一个黑客攻击。

答案 1 :(得分:0)

我假设你不能因为某种原因不能为商店设置根值?这就是我通常这样做的方式。