ExtJS 5.1不会将嵌套的JSON对象发送到我的服务器

时间:2015-05-05 10:16:46

标签: json post extjs

我试图通过我的商店代理将嵌套的JSON对象发送到我的服务器。我使用的是ExtJS 5.1,在下面的代码中,我使用了hasMany属性来指定嵌套的JSON模型。

Ext.define('MyApp.model.PersonStore',{
     extend: 'Ext.data.Store',
     model: 'MyApp.model.Person',
     storeId: 'PersonStore',
     proxy: {
        type: 'ajax', 
        url: 'http://localhost:80/index.php?person=create', 
        reader: {
           type: 'json'
        },
        writer: {
           type: 'json'
        }
    }
});

Ext.define('MyApp.model.Person',{
     extend: 'Ext.data.Model',
     idProperty: 'id',
     fields: [
         {name: 'id', type: 'int'},
         {name: 'name', type: 'string'},
         {name: 'age', type: 'int'},
     ],
     hasMany: {
         model: 'MyApp.model.Item',
         name: 'items',
         associationKey: 'items'    
     } 
});

Ext.define('MyApp.model.Item',{
     extend: 'Ext.data.Model', 
     fields: [
         {
             name: 'id', 
             type: 'int'
         },
         {
             name: 'itemType', 
             type: 'string'
         }
     ],
     belongsTo: 'MyApp.model.Person'     
});

然后在我的控制器中创建一个新人时,我这样做:

var store = grid.getStore();
store.add({name: 'Steve', age: '50'});
var lastInsertedPerson = store.last();
var items = lastInsertedPerson.items();
items.add({itemType: 'item1'}); 
items.add({itemType: 'item2'}); 

store.sync();

然后POST请求以这种格式发送:

{"id":"MyApp.model.Person-1", "name":"Steve", "age":"50"}

但我希望它是:

{"id":"MyApp.model.Person-1", "name":"Steve", "age":"50", "items":[{"itemType":"item1"}, {"itemType":"item2"}]}

那么为什么POST请求中的json对象不包含嵌套的Item对象?

1 个答案:

答案 0 :(得分:0)

为了使嵌套数据出现在post对象中,您必须在父模型的代理编写器对象中设置配置。因此,如果您将Person模型更改为类似下面的代码,则嵌套对象应该通过:

Ext.define('MyApp.model.Person',{
    extend: 'Ext.data.Model',
    idProperty: 'id',
    fields: [
        {name: 'id', type: 'int'},
        {name: 'name', type: 'string'},
        {name: 'age', type: 'int'},
    ],
    hasMany: {
        model: 'MyApp.model.Item',
        name: 'items',
        associationKey: 'items'
    },
    proxy: {
        url: '/url/to/your/backend/service',
        writer: {
            type: 'json',
            allDataOptions: {
                associated: true
            }
        }
    }
});

请注意,编写器也有partialDataOptions配置,因此如果您希望嵌套数据在PUT中通过,则还必须在那里设置associated配置。有关编写器配置选项的更多详细信息,请参阅Ext Docs