extjs嵌套json store rails

我正在使用Ext JS&Rails作为后端..我正在使用具有父子关系的myysql数据库,即1对多关系……我想要一个可用于加载“GRID”的“单一”JSON存储带有父记录和子记录的数据..还有什么办法可以将表单和网格绑定到同一个商店但是有不同的jsonreaders吗? 即form的datareader将使用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 } 

新的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()会返回使用Orders模型配置的Store,因为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')); }); }); } }); 

您可以使用覆盖默认渲染方法。 为列定义渲染器方法。

 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存储的字段mapping到嵌套的json。 例如,如果您需要访问产品名称,则可以:

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

您也可以使用数组表示法而不是点运算符。 例如: "products['prodnm']"