Модель Extjs для вложенной структуры JSON

#javascript #json #extjs #sencha-touch

#javascript #json #extjs #сенча-касание

Вопрос:

Рассмотрим следующую структуру JSON

 {
        "id": 123,
        "name": "Ed",
        "orders": [
            {
                "id": 50,
                "total": 100,
                "order_items": [
                    {
                        "id": 20,
                        "price": 40,
                        "quantity": 2,
                        "product": {
                            "id": 1000,
                            "name": "MacBook Pro"
                        }
                    },
                    {
                        "id": 21,
                        "price": 20,
                        "quantity": 3,
                        "product": {
                            "id": 1001,
                            "name": "iPhone"
                        }
                    }
                ]
            }
        ]
    }
  

Вот мои модели

 Ext.define("User", {
    extend: 'Ext.data.Model',
    fields: [
        'id', 'name'
    ],

    hasMany: {model: 'Order', name: 'orders', associationKey: 'orders'}
});

Ext.define("Order", {
    extend: 'Ext.data.Model',
    fields: [
        'id', 'total'
    ],

    hasMany  : {model: 'OrderItem', name: 'orderItems', associationKey: 'order_items'}
});

Ext.define("OrderItem", {
    extend: 'Ext.data.Model',
    fields: [
        'id', 'price', 'quantity'
    ],
    hasOne : {
        model: 'Product', 
        name: 'product', 
        associationKey: 'product'
    }
});

Ext.define("Product", {
    extend: 'Ext.data.Model',
    fields: [
        'id', 'name'
    ]
});
  

Когда я загружаю данные в свое хранилище, а затем проверяю запись хранилища, я вижу это

введите описание изображения здесь

Я не получаю заказы и прочее внутри него. Должно быть, что-то не так с тем, как я определил модели, но, похоже, я не могу в этом разобраться. Заранее спасибо.

Обновление Вот мое хранилище и то, как я загружаю данные

 Ext.define('Company.store.TestOrders', {
    extend: 'Ext.data.Store',
    alias: 'store.testorders',
    model: 'User',
    data:[
    {
        "id": 123,
        "name": "Ed",
        "orders": [
            {
                "id": 50,
                "total": 100,
                "order_items": [
                    {
                        "id": 20,
                        "price": 40,
                        "quantity": 2,
                        "product": {
                            "id": 1000,
                            "name": "MacBook Pro"
                        }
                    },
                    {
                        "id": 21,
                        "price": 20,
                        "quantity": 3,
                        "product": {
                            "id": 1001,
                            "name": "iPhone"
                        }
                    }
                ]
            }
        ]
    }],
    storeId: 'TestOrders',
    proxy: {
        type: 'memory'
    }
});
  

Затем позже я просматриваю данные, используя

 Ext.getStores('TestOrders').getAt(0);
  

Комментарии:

1. здравствуйте, можете ли вы предоставить хранилище и элемент, к которому вы его прикрепляете? где нет проблем с вашим кодом. это работает, вы можете проверить это на этой скрипке fiddle.sencha.com/#view/editoramp;fiddle/2qqj

2. @LightNight Спасибо за ответ. Я обновил свой вопрос, включив в него хранилище и способ загрузки данных.

3. @LightNight, я вижу разницу между вашим подходом и моим. Можете ли вы сказать мне, почему для вашей модели магазина установлено значение «Продукт» вместо «Пользователь». Я думал, мы должны были назначить корневую модель хранилищу в подобных случаях?

Ответ №1:

Может быть, вы ищете способ получать заказы и заказывать товары из пользовательского магазина?

Вы можете получить коллекцию заказов из записи пользователя, используя метод record.orders() . То же самое для элемента заказа в записи коллекции заказов : order_record.order_items() .

Проверьте этот пример на fiddle

Комментарии:

1. Вы правы. Это дает мне то, что я искал.