Sencha touch 2加载存储和关联存储与嵌套JSON

时间:2012-06-07 22:14:51

标签: json associations sencha-touch-2 store

我已经开始创建一个Sencha Touch 2应用程序,它有两个定义的模型,Change和Configuration。更改属于配置。两个型号都有商店设置。在Changes商店中,我有一个代理设置来请求以JSON格式返回的数据。 JSON数据具有嵌套配置的更改。加载很好,但是当我尝试从Change实例获取关联的Configuration时,它无法正常工作。

我已经定义了这样的模型:

更改模型:

Ext.define('Changes.model.Change', {
    extend: 'Ext.data.Model',
    xtype: 'changemodel',

    config: {
        fields: [ 
            {name:'id', type:'int'},
            {name:'changeId', type:'string'},
            {name:'briefDescription', type:'string'},
            {name:'configuration_id', type:'int'}
        ],
        associations: [{
            type:'belongsTo', 
            model:'Changes.model.Configuration',
            primaryKey: 'id',
            foreignKey: 'configuration_id',
            associationKey: 'configurations'
        }],
    },
});

配置模型:

Ext.define('Changes.model.Configuration', {
    extend: 'Ext.data.Model',
    xtype: 'configurationmodel',
    config: {
        fields: [
             { name: 'id', type: 'int'},
             { name: 'longName', type: 'string' },
             { name: 'ciName', type: 'string' },
            ],
        hasMany: {model: 'Change', name: 'changes'}
    }
});

每个型号都有一个商店。

更改商店:

Ext.define('Changes.store.Changes', {
    extend: 'Ext.data.Store',
    requires: 'Changes.model.Change',
    config: {
        model: 'Changes.model.Change',  
        proxy: {
            type: 'ajax',
            url: 'services/changes.php',
            reader: {
                type: 'json',
                rootProperty: 'changes'
            }
        },
        sorters: [{ property: 'briefDescription', direction: 'ASC'}],
    }
});

配置存储:

Ext.define('Changes.store.Configurations', {
    extend: 'Ext.data.Store',
    requires: ['Ext.data.proxy.LocalStorage'],
    config: {
        model: 'Changes.model.Configuration',
        grouper: {
                sortProperty: "ciName",
                direction: "DESC",
                groupFn: function (record) {
                    return record.get('ciName')[0];
                }
           },
        proxy: {
            type: 'ajax',
            url: 'services/configurationItems.php',
            reader: {
                type: 'json',
                rootProperty: 'configurationItems'
            }
        }
    }
});

services/changes.php返回的我的JSON如下所示:

{
    "success": true,
    "changes": [
        {
            "id": 1,
            "changeId": "XYZ19178263",
            "briefDescription": "Loaded from Proxy",
            "configuration_id": 3,
            "configurations": [
                {
                    "id": "3",
                    "longName": "999-99_-_windows_7_desktop.Computer.Windows",
                    "ciName": "999-99_-_windows_7_desktop"
                }
            ]
        }
    ]
}

在浏览器的控制台中,我可以发出以下命令:

Changes.myStore = Ext.getStore('Changes');
Changes.myStore.load();
Changes.record = Changes.myStore.findRecord('id', '1');
Changes.record.getAssociatedData()

最后一个命令将返回一个内部包含Configuration对象的对象,但所有字段值都显示null,但id除外,它似乎设置为随机值:

Object
Configuration: Object
ciName: null
id: "ext-record-11"
longName: null

有人能看出为什么我的JSON中的嵌套Configuration实例没有被保存?是否应将JSON中的嵌套Configuration实例自动添加到Configurations商店?

2 个答案:

答案 0 :(得分:2)

可悲的是,这不起作用。似乎是框架的缺点。您无法加载和保存关联(聚合/嵌套)对象。您需要展平您的结构,然后自己在代码中关联对象。

例如......你的JSON就是......

{
"success": true,
"changes": [
    {
        "id": 1,
        "changeId": "XYZ19178263",
        "briefDescription": "Loaded from Proxy"
    }
]

}

第二个JSON文件/响应如下:

    {

    "success": true,
    "configurations": [
                {
                    "id": "3",
                    "longName": "999-99_-_windows_7_desktop.Computer.Windows",
                    "ciName": "999-99_-_windows_7_desktop",
                    "change_id": 1
                }
            ]
    }

答案 1 :(得分:2)

Tinashe的回答是不正确的。你当然可以获得嵌套模型。

但是,关于JSON,你的关联是向后的。

 "changes": [
        {
            "id": 1,
            "changeId": "XYZ19178263",
            "briefDescription": "Loaded from Proxy",
            "configuration_id": 3,
            "configurations": [
                {
                    "id": "3",
                    "longName": "999-99_-_windows_7_desktop.Computer.Windows",
                    "ciName": "999-99_-_windows_7_desktop"
                }
            ]
        }
    ]

表示更改hasMany配置,但您说它属于它。这是正确的JSON:

 "changes": [
        {
            "id": 1,
            "changeId": "XYZ19178263",
            "briefDescription": "Loaded from Proxy",
            "configuration_id": 3,
            "configuration": 
                {
                    "id": "3",
                    "longName": "999-99_-_windows_7_desktop.Computer.Windows",
                    "ciName": "999-99_-_windows_7_desktop"
                }

        }
    ]

无论哪种方式,您都需要在关系中设置getterName(如果您愿意,也可以设置setterName):

associations: [{
            type:'belongsTo', 
            model:'Changes.model.Configuration',
            primaryKey: 'id',
            foreignKey: 'configuration_id',
            associationKey: 'configuration',
            getterName:'getConfiguration'
        }]

然后在加载商店后,你可以调用myChangeModel.getConfiguration();