Вложенные рельсы магазина json в extjs

я работаю с Ext JS и Rails в качестве бэкэнда. У меня есть база данных myysql, которая имеет отношения родитель-потомок, т.е. отношения 1-ко-многим... Мне нужен «один» магазин JSON, который можно использовать для загрузки «GRID» данные с родительскими и дочерними записями. Также есть ли способ связать как форму, так и сетку с одним и тем же хранилищем, но с разными jsonreaders? т. е. средство чтения данных формы будет читать строку с root: 'customers', а grid будет читать строку с root :'products'? JSON выглядит так:

{
        "customers": [{
            "amt": 8000,
            "custnm": "rashmi",
            "id": 2,
            "purdt": "2011-04-27",
            "products": [{
                "amt": 40,
                "customer_id": 2,
                "id": 3,
                "prodnm": "oil",
                "qty": 1,
                "rate": 40
            }]
        }, {
            "amt": 300000,
            "custnm": "bhumika",
            "id": 3,
            "purdt": "2011-04-14",
            "products": [{
                "amt": 40,
                "customer_id": 3,
                "id": 1,
                "prodnm": "soap",
                "qty": 20000,
                "rate": 20
            }, {
                "amt": 150,
                "customer_id": 3,
                "id": 2,
                "prodnm": "shampoo",
                "qty": 3000,
                "rate": 50
            }, {
                "amt": null,
                "customer_id": 3,
                "id": 14,
                "prodnm": "aa",
                "qty": 2,
                "rate": null
            }]
        }, {
            "amt": 15000,
            "custnm": "Shruti",
            "id": 13,
            "purdt": "2011-04-08",
            "products": []
        }, {
            "amt": 200000,
            "custnm": "Jayesh",
            "id": 14,
            "purdt": "2011-03-31",
            "products": []
        }, {
            "amt": 220000,
            "custnm": "SHRUTI",
            "id": 15,
            "purdt": "2011-04-06",
            "products": []
        }, {
            "amt": 10000,
            "custnm": "RASHMI",
            "id": 24,
            "purdt": "2011-04-06",
            "products": []
        }],
        "results": 6
    }

person Wanderer    schedule 21.04.2011    source источник
comment
если вы пытаетесь показать json, пожалуйста, сделайте его читабельным. вот попробуйте это: jsbeautifier.org . также в вашем json вы забыли добавить последний }   -  person Egy Mohammad Erdin    schedule 21.04.2011


Ответы (2)


В новом Ext JS 4 есть ассоциации моделей, которые решат проблему (http://docs.sencha.com/ext-js/4-0/guide/data)

// each User hasMany Orders
Ext.define('User', {
    extend: 'Ext.data.Model',
    fields: ['id', 'name', 'email'],
    proxy : {
        type: 'rest',
        url : '/users',
        reader: 'json'
    },

    hasMany: 'Orders'
});

// each Order belongsTo a User, and hasMany OrderItems
Ext.define('Order', {
    extend: 'Ext.data.Model',
    fields: ['id', 'user_id', 'status'],
    belongsTo: 'User',
    hasMany: 'OrderItems'
});

// each OrderItem belongsTo an Order
Ext.define('OrderItem', {
    extend: 'Ext.data.Model',
    fields: ['id', 'order_id', 'name', 'description', 'price', 'quantity'],
    belongsTo: 'Order'
});

Вызов user.orders() возвращает Store, сконфигурированный с моделью Orders, поскольку модель User определила ассоциацию hasMany: «Orders».

User.load(123, {
    success: function(user) {
        //we can iterate over the orders easily using the Associations API
        user.orders().each(function(order) {
            console.log(order.get('status'));

            //we can even iterate over each Order's OrderItems:
            order.orderItems().each(function(orderItem) {
                console.log(orderItem.get('title'));
            });
        });
    }
});
person sdavids    schedule 28.04.2011
comment
спасибо @sdavids ... я столкнулся с проблемой использования extjs 4, поэтому я использую extjs 3 ... мои компоненты пользовательского интерфейса были разработаны с использованием extjs Designer 1.1.2 ... если я использую js-файлы extjs 4, я получаю много ошибок .... так что вы можете предложить мне любую альтернативу ?? - person Wanderer; 28.04.2011

Вы можете использовать переопределение метода рендеринга по умолчанию. Определите метод визуализации для столбца.

renderer: function(value, metaData, record, rowIndex, colIndex, store) {
      // you can use record.get method to access the data you require
      return the_retrived_data;
 }

Вам нужно использовать свойство mapping для сопоставления полей вашего хранилища json с вложенным json. Например, если вам нужно получить доступ к названию продукта, вы можете:

{name: 'productname', mapping: 'products.prodnm'} 

Вы также можете использовать запись массива вместо оператора точки. пример: "products['prodnm']".

person Abdel Raoof Olakara    schedule 21.04.2011
comment
спасибо @abdel... сопоставление не работает, когда для одной записи клиента имеется несколько записей о продуктах.. т.е. не работает с массивом.. :( - person Wanderer; 21.04.2011
comment
попробуйте использовать метод рендеринга и получите доступ к объекту записи или объекту хранилища, чтобы получить правильное значение для отображения... - person Abdel Raoof Olakara; 21.04.2011