5

ネストされたjsonからのデータを(失敗して)表示しようとしています。

JSONは次のようになります。

{
    "contacts": [
        {
            "id": "1",
            "client_id": "135468714603",
            "addresses": [
                {
                    "id": "1",
                    "contact_id": "1",
                    "address_id": "16",
                    "address": {
                        "0": {
                            "id": "16",
                            "address": "123 Some Rd",
                            "address2": "",
                            "city": "Toen",
                            "state": "VS",
                            "zip_code": "11111",
                            "country": "USA"
                        }
                    }
                },
                {
                    "id": "6",
                    "contact_id": "1",
                    "address_id": "26",
                    "address": {
                        "0": {
                            "id": "26",
                            "address": "1 Other Road",
                            "address2": "",
                            "city": "Twn",
                            "state": "BD",
                            "zip_code": "11112",
                            "country": "USA"
                        }
                    }
                }
            ]
        },
        {
            "id": "10",
            "client_id": null,
            "addresses": [
                {
                    "id": "8",
                    "contact_id": "10",
                    "address_id": "28",
                    "address": {
                        "0": {
                            "id": "28",
                            "address": "54 Road",
                            "address2": "",
                            "city": "TWND",
                            "state": "TT",
                            "zip_code": "11113",
                            "country": "USA"
                        }
                    }
                },
                {
                    "id": "9",
                    "contact_id": "10",
                    "address_id": "29",
                    "is_mailing_address": "0",
                    "is_primary_address": "0",
                    "display_priority": "0",
                    "address": {
                        "0": {
                            "id": "29",
                            "address": "6 Road",
                            "address2": "",
                            "city": "TOEOEOWN",
                            "state": "PY",
                            "zip_code": "11116",
                            "country": "USA"
                        }
                    }
                },
                {
                    "id": "10",
                    "contact_id": "10",
                    "address_id": "30",
                    "address": {
                        "0": {
                            "id": "30",
                            "address": "PO Box 9",
                            "address2": "",
                            "city": "TOYN",
                            "state": "GF",
                            "zip_code": "11118",
                            "country": "USA"
                        }
                    }
                }
            ]
        },
        {
            "id": "11",
            "client_id": null,
            "contact_id": "11",
            "addresses": [
                {
                    "id": "11",
                    "contact_id": "11",
                    "address_id": "33",
                    "is_mailing_address": "0",
                    "is_primary_address": "0",
                    "display_priority": "0",
                    "address": {
                        "0": {
                            "id": "33",
                            "address": "4 Street",
                            "address2": "",
                            "city": "TEOIN",
                            "state": "TG",
                            "zip_code": "11119",
                            "country": "USA"
                        }
                    }
                }
            ]
        }
    ]
}

モデルフィールドを必要なものにマッピングしようとしましたが(たとえば、連絡先モデル>アドレスフィールド>マッピング:アドレス)、アドレス[0] .address [0]にマッピングする必要があるため、これは機能しません。明らかに他のアドレスを破棄するデータ。

アソシエーションも試してみましたが、これは別のモデルとストアのようです。ここでの考え方は、連絡先とそのアドレスを個別に要求しないことです。

また、テンプレートでjsonを直接掘り下げてみました(これが最も簡単な方法のようです)。たとえば、{addresses.address.city}は機能しません。

考え方は単純です。いくつかのjsonを取得し、アプリのさまざまな部分にそのjsonのさまざまな部分を表示します。

その経験は恐ろしいものでした。

テンプレートからアクセスできるように、これらのネストされたjsonアイテムをマップする方法を誰かが説明できますか?

レンプレート:

{
    xtype: 'container',
    flex: 1,
    id: 'mainPanel',
    items: [
        {
            xtype: 'dataview',
            hidden: false,
            id: 'clientsContacts',
            minHeight: 200,
            itemSelector: 'div',
            itemTpl: [
                '{id} | {last_name} | {first_name} | {relationship} | {addresses}'
            ],
            store: 'Contacts'
        }
    ]
}

店:

Ext.define('MyApp.store.Contacts', {
    extend: 'Ext.data.Store',

    requires: [
        'MyApp.model.Contacts'
    ],

    constructor: function(cfg) {
        var me = this;
        cfg = cfg || {};
        me.callParent([Ext.apply({
            autoLoad: false,
            storeId: 'Contacts',
            model: 'MyApp.model.Contacts',
            proxy: {
                type: 'ajax',
                extraParams: {
                    id: '',
                    format: 'json'
                },
                url: '/api/contacts/', //the json
                reader: {
                    type: 'json',
                    root: 'contacts'
                }
            },
            listeners: {
                load: {
                    //fn: me.onJsonstoreLoad,
                    //scope: me
                }
            }
        }, cfg)]);
    },
});

モデル:

Ext.define('MyApp.model.Contacts'、{extend:'Ext.data.Model'、

    uses: [
        //'MyApp.model.Client',
        //'MyApp.model.contactAddressModel'
    ],

    fields: [
        {
            name: 'client_id'
        },
        {
            name: 'id'
        },
        {
            name: 'addresses',
            mapping: 'addresses'//doesn't work
            //mapping: 'addresses[0].address[0]' //works, but only for the first address duh
        }
    ],
});

SenchaArchitectを介したextjs4.1の使用。

どんな助けでも大歓迎です。

ありがとう。

4

2 に答える 2

4

私はそれを手に入れたと思います(うまくいけばそれは正しいです)。

したがって、必要なデータのネストされたグループごとにフィールドを作成します。だから私は連絡先モデルを持っています。そのモデルには、次のフィールドがあります。

id
client_id
addresses //mapped to addresses
address //mapped to addresses.address 

次に、テンプレートで:

<br>
<tpl for="addresses">
    id: {id}<br>
    addy id: {address_id}<br>

    <tpl for="address">
        {city} {state}, {zip}<br>
    </tpl>

</tpl>

これは全体がどのように見えるかです:

意見

Ext.define('MyApp.view.MyView', {
    extend: 'Ext.view.View',

    height: 250,
    width: 400,
    itemSelector: 'div',
    store: 'MyJsonStore',

    initComponent: function() {
        var me = this;

        Ext.applyIf(me, {
            itemTpl: [
                '<br>',
                '<tpl for="addresses">',
                '    id: {id}<br>',
                '    addy id: {address_id}<br>',
                '    <b>',
                '    <tpl for="address">',
                '        {city} {state}, {zip}<br><br>',
                '    </tpl>',
                '    </b>',
                '',
                '</tpl>',
                '',
                '<hr>',
                ''
            ]
        });

        me.callParent(arguments);
    }

});

Ext.define('MyApp.store.MyJsonStore', {
    extend: 'Ext.data.Store',

    requires: [
        'MyApp.model.Contacts'
    ],

    constructor: function(cfg) {
        var me = this;
        cfg = cfg || {};
        me.callParent([Ext.apply({
            storeId: 'MyJsonStore',
            model: 'MyApp.model.Contacts',
            data: {
                contacts: [
                    {
                        id: '1',
                        client_id: '135468714603',
                        addresses: [
                            {
                                id: '1',
                                contact_id: '1',
                                address_id: '16',
                                address: {
                                    '0': {
                                        id: '16',
                                        address: '123 Some Rd',
                                        address2: '',
                                        city: 'Toen',
                                        state: 'VS',
                                        zip_code: '11111',
                                        country: 'USA'
                                    }
                                }
                            },
                            {
                                id: '6',
                                contact_id: '1',
                                address_id: '26',
                                address: {
                                    id: '26',
                                    address: '1 Other Road',
                                    address2: '',
                                    city: 'Twn',
                                    state: 'BD',
                                    zip_code: '11112',
                                    country: 'USA'
                                }
                            }
                        ]
                    },
                    {
                        id: '10',
                        client_id: null,
                        addresses: [
                            {
                                id: '8',
                                contact_id: '10',
                                address_id: '28',
                                address: {
                                    id: '28',
                                    address: '54 Road',
                                    address2: '',
                                    city: 'TWND',
                                    state: 'TT',
                                    zip_code: '11113',
                                    country: 'USA'
                                }
                            },
                            {
                                id: '9',
                                contact_id: '10',
                                address_id: '29',
                                is_mailing_address: '0',
                                is_primary_address: '0',
                                display_priority: '0',
                                address: {
                                    id: '29',
                                    address: '6 Road',
                                    address2: '',
                                    city: 'TOEOEOWN',
                                    state: 'PY',
                                    zip_code: '11116',
                                    country: 'USA'
                                }
                            },
                            {
                                id: '10',
                                contact_id: '10',
                                address_id: '30',
                                address: {
                                    id: '30',
                                    address: 'PO Box 9',
                                    address2: '',
                                    city: 'TOYN',
                                    state: 'GF',
                                    zip_code: '11118',
                                    country: 'USA'
                                }
                            }
                        ]
                    },
                    {
                        id: '11',
                        client_id: null,
                        contact_id: '11',
                        addresses: [
                            {
                                id: '11',
                                contact_id: '11',
                                address_id: '33',
                                is_mailing_address: '0',
                                is_primary_address: '0',
                                display_priority: '0',
                                address: {
                                    id: '33',
                                    address: '4 Street',
                                    address2: '',
                                    city: 'TEOIN',
                                    state: 'TG',
                                    zip_code: '11119',
                                    country: 'USA'
                                }
                            }
                        ]
                    }
                ]
            },
            proxy: {
                type: 'memory',
                reader: {
                    type: 'json',
                    root: 'contacts'
                }
            }
        }, cfg)]);
    }
});

モデル

Ext.define('MyApp.model.Contacts', {
    extend: 'Ext.data.Model',

    fields: [
        {
            name: 'id'
        },
        {
            name: 'client_id'
        },
        {
            name: 'addresses',
            mapping: 'addresses'
        },
        {
            name: 'address',
            mapping: 'address'
        }
    ]
});
于 2013-03-06T19:46:18.443 に答える
1

上記の回答が機能することを確認しましたが、将来の人々のために、サブフィールドの名前を指定しない場合は、2番目のネストされたテンプレートは必要ないことに注意してください。あなたは最初だけでそれを行うことができます。

于 2014-03-24T14:11:55.327 に答える