4

変更と構成の2つのモデルが定義されたSenchaTouch2アプリの作成を開始しました。変更は構成に属します。どちらのモデルにもストアが設定されています。変更ストアには、JSON形式で返されるデータを要求するためのプロキシ設定があります。JSONデータには、ネストされた構成による変更があります。変更は問題なく読み込まれますが、変更インスタンスから関連する構成を取得しようとすると、機能しません。

私はこのようにモデルを定義しました:

モデルの変更:

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'
            }
        }
    }
});

から返される私のJSONはservices/changes.php次のようになります。

{
    "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()

最後のコマンドは、構成オブジェクトが内部にあるオブジェクトを返しますが、ランダムな値に設定されているように見えるものをnull除いて、すべてのフィールド値が表示されます。id

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

JSONのネストされたConfigurationインスタンスが保存されない理由を誰かが理解できますか?Configurationまた、JSON内のネストされたインスタンスをConfigurationsストアに自動的に追加する必要がありますか?

4

2 に答える 2

2

悲しいことに、これはうまくいきません。フレームワークの欠点のようです。関連する(集約/ネストされた)オブジェクトをロードおよび保存することはできません。構造を平坦化してから、コード内のオブジェクトを自分で関連付ける必要があります。

たとえば...あなたのJSONは...

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

}

そして、2番目のJSONファイル/応答は次のとおりです。

    {

    "success": true,
    "configurations": [
                {
                    "id": "3",
                    "longName": "999-99_-_windows_7_desktop.Computer.Windows",
                    "ciName": "999-99_-_windows_7_desktop",
                    "change_id": 1
                }
            ]
    }
于 2012-06-14T21:22:41.520 に答える
2

ティナシェの答えは正しくありません。あなたは確かにネストされたモデルを得ることができます。

ただし、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"
                }
            ]
        }
    ]

変更が多くの​​構成を持っていることを意味しますが、あなたはそれがそれに属していると言っています。これは正しい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();を呼び出すことができます。

于 2013-04-10T07:48:16.537 に答える