ExtJS4在网格中显示来自多个存储的数据

ExtJS4在网格中显示来自多个存储的数据,extjs,grid,extjs4,Extjs,Grid,Extjs4,我有两种型号-例如-用户和订单 Ext.define('AM.model.User', { extend: 'Ext.data.Model', fields: ['id', 'username', 'firstName', 'lastName', 'state', 'city'], associations: [ { type: 'hasMany', model: 'Order', na

我有两种型号-例如-用户和订单

Ext.define('AM.model.User', {
    extend: 'Ext.data.Model',
    fields: ['id', 'username', 'firstName', 'lastName', 'state', 'city'],

    associations: [
    {
            type: 'hasMany', 
            model: 'Order', 
            name: 'orders'
    },],        
});

Ext.define('AM.model.Order', {
    extend: 'Ext.data.Model',
    fields: ['id', 'userId', 'date', 'description', 'value'],    
    belongsTo: 'User',   
});
还有他们的商店。我正在寻找一种在网格中显示两个存储区的数据的方法。(因此我的列将是
firstName
lastName
orderDate
orderDescription
orderValue
。)

显示它们的正确方式是什么


谢谢。

您应该使用服务器端代码执行此操作,并将所有数据保存到单个存储中。

如果要使用关联执行此操作,您需要为网格列定义一个渲染器。
像这样:

{
        text: "orderDescription",
        renderer: function(value,meta,record){//1.
       //var orderStore = record.orderStore;//2a.
       //var orderList = ordersStore.data.items;//2b.
       var orderList = record.orders().data.items; //3.This line is the same as 2 the lines above(2a,2b).
       var order = orderList[0]; //4. TODO..loop through your list. 
       var description = order.data.description; //5. 
       return description ;
 },

我会尽力为任何想这样做的人解释。

  • 第三个参数是正在为网格渲染的“用户”存储区中的当前记录。前两个参数只需存在于该存储区中,即可接收记录。忽略它们将不起作用。

  • 1a/1b.我把这些放在那里是为了演示关联是如何工作的。基本上,“用户”存储中的每个记录都有自己相应的“订单存储”。它将被称为“订单存储”,因为您将关联放入了
    [名称:'orders']
  • orders()
    方法是自动创建的,同样基于名称“orders”。这只是返回
    orderStore
    。该存储包含一个字段
    data
    ->,其中包含一个字段
    items
    items
    是实际的订单列表
  • 现在您可以访问您的订单列表。您现在可以在订单之间循环。或者,如果您只有一个订单,则只需第一个订单
  • 您的
    订单
    再次包含一个字段
    数据
    ,其中包含您的实际数据。


  • 让我们试试下面的例子-

    步骤1:将记录从存储2添加到存储2。 步骤2:将存储2中的记录与存储1一起使用。 例如,第一个数据列来自存储区1,而存储区2的数据形成列2和3。如果“其他”列只是“查找”数据,则可以使用渲染器在第二个存储区中查找数据,例如:

    var store1 = new Ext.data.Store({
        ...,
        fields: ['field1', 'field2']
    });
    
    var store2 = new Ext.data.Store({
        ...
        id: 'field2',
        fields: ['field2', 'fieldA', 'fieldB']
    });
    
    var renderA = function(value) {
        var rec = store2.getById(value);
        return rec ? rec.get('fieldA') : '';
    }
    var renderB = function(value) {
        var rec = store2.getById(value);
        return rec ? rec.get('fieldB') : '';
    }
    
    var columns = [
        {header: 'Field 1', dataIndex: 'field1'},
        {header: 'Field A', dataIndex: 'field2', renderer: renderA},
        {header: 'Field B', dataIndex: 'field2', renderer: renderB}
    ];
    
    祝你好运


    Ref.from

    注意
    关联后多余的逗号
    belongsTo
    。请记住,orders()方法不仅返回订单记录的存储,而且会自动筛选,以仅包括与您定义的关联相匹配的订单。换句话说,当record是用户时,您调用record.orders(),您将获得一个仅包含该特定用户订单的存储,而不是订单存储中的每个订单。我还怀疑返回的存储是否按照答案所示预加载。在我的项目中,我必须在获取存储后进行加载,以获取相关数据记录。这取决于您如何加载数据。何时加载加载用户并在json结果中包含用户订单,相关数据已加载。否则,必须手动加载相关订单。。
    var store1 = new Ext.data.Store({
        ...,
        fields: ['field1', 'field2']
    });
    
    var store2 = new Ext.data.Store({
        ...
        id: 'field2',
        fields: ['field2', 'fieldA', 'fieldB']
    });
    
    var renderA = function(value) {
        var rec = store2.getById(value);
        return rec ? rec.get('fieldA') : '';
    }
    var renderB = function(value) {
        var rec = store2.getById(value);
        return rec ? rec.get('fieldB') : '';
    }
    
    var columns = [
        {header: 'Field 1', dataIndex: 'field1'},
        {header: 'Field A', dataIndex: 'field2', renderer: renderA},
        {header: 'Field B', dataIndex: 'field2', renderer: renderB}
    ];