【问题标题】:Loading store dynamically based on visible page data for Ext.grid.Panel column根据 Ext.grid.Panel 列的可见页面数据动态加载存储
【发布时间】:2013-09-07 13:40:45
【问题描述】:

下面是 Ext.grid.Panel 列的渲染器。假设 contactStore 中有 2,000 个值,我只关心基于 id 的记录名称(在本例中为 value 参数),而我的网格中只有 25 行/记录我所在的页面。如何动态获取存储,以便获取网格列 id 的相关关联记录(基于外键),而不是加载所有 2,000 条记录?有没有办法加载商店,然后在回调中,以某种方式让这个“渲染器”函数在回调成功后显示值?

columns: [{

...

}, {
    header: 'Contact Name',
    flex: 1,
    sortable: true,
    dataIndex: 'contact_id',        
    renderer: function(value) {
        var contactStore = Ext.StoreManager.lookup('Contacts');
        return contactStore.getById(value).get('full_name');
    }
}, {

【问题讨论】:

  • 我认为您将不得不破解渲染器或表格视图。在第一种情况下,这可能意味着联系人存储将在每次页面加载时发出 25 个请求;你考虑过吗?在后一种情况下,您是否有办法让联系人存储一次加载 25 个随机联系人?
  • 我已经了解了几种不同的方法。 (1) 拥有一个单独的存储并根据页面中的数据加载该存储 (2) 将名称作为附加字段加载到网格存储中 (3) 使用关联模型并获取我们关心的记录的名称关联商店........虽然我找不到其他商店的例子......你会推荐什么 Rixo?
  • 如果您可以控制服务器,我肯定会将名称字段添加到网格模型中。这将为您节省大量请求,并使您的代码更简单。因此更稳定。

标签: extjs dynamic extjs4 store renderer


【解决方案1】:

您可以为此调整viewConfig 中的collectData(records, startIndex)

Ext.create('Ext.grid.Panel', {
    (...)
    viewConfig: {
        //this method needs to be adjusted
        collectData: function(records, startIndex) {
            var me = this;
            //we can use a custom function for this
            if (me.onBeforeCollectData) {
                me.onBeforeCollectData(records);
            }            
            var data = me.superclass.collectData.call(me, records, startIndex);
            return data;
        },

        onBeforeCollectData: function(records) {
            var newExtraParams = [];
            var oldExtraParams;
            var needToLoadStore = false;
            var contactStore = Ext.StoreManager.lookup('Contacts');         

            if (contactStore) {
                oldExtraParams = contactStore.oldExtraParams;
            } else {
                //don't use autLoad: true, this will be a local store
                contactStore = Ext.create('Ext.data.Store', {
                    storeId:'Contacts',
                    (...)                   
                });
                needToLoadStore = true;
            }

            for (var x in records) {
                //contact_id is read out here
                var param = records[x].get('contact_id');
                if (param) {
                    if (needToLoadStore == false && Ext.Array.contains(oldExtraParams, param) == false) {
                        needToLoadStore = true;
                    }
                    newExtraParams.push(param);
                }                
            }           

            if (needToLoadStore == true) {
                //we use this to load the store data => because of async: false property
                Ext.Ajax.request({
                    scope: this,
                    //this is for synchronous calls
                    async: false,
                    url: (...),
                    method: (...),
                    params: newExtraParams,
                    success: function (res, opt) {
                        var responseObj = Ext.decode(res.responseText, false);
                        contactStore.loadData(responseObj); //or deeper in the responseObj if needed
                        contactStore.oldExtraParams = newExtraParams;
                    }
                });
            }
        }
    }
});

【讨论】:

  • +1 用于回答.. 我已经阅读了几种不同的方法。 (1) 拥有一个单独的存储并根据页面中的数据加载该存储 (2) 将名称作为附加字段加载到网格存储中 (3) 使用关联模型并获取我们关心的记录的名称关联商店........虽然我找不到其他商店的例子......你会推荐什么 Alexander?
  • 我在想类似的事情。我不会每次都创建联系人存储,而是将其附加到视图中。不要忘记使用onBeforeCollectData 中的extraParams 触发商店加载。最后,您需要一个回调,在加载联系人存储后调用视图的refresh 方法。现在,有趣的是collectDatarefresh中被调用,所以你需要添加一个测试来防止onBeforeCollectData在回调中调用refresh时被调用,否则你会得到一个无限循环.
  • @MacGyver 我会推荐(2),因为那样你只需要给column 一个自定义的rendererreturn record.get('contactName'); 我会使用(1)如果你在更多列或网格存储加载webservice的后端无法轻松将此字段添加到存储中。
  • 根据@rixo 的建议调整了答案
  • 太好了,谢谢!这容易得多。而且我不需要任何技巧。除了 id 之外,我将在我的模型中为每个 FK 字段添加记录“名称”字段。我在想一个普通人在渲染之后也希望根据名称而不是 id 进行排序。
猜你喜欢
  • 1970-01-01
  • 2013-07-28
  • 2016-10-27
  • 2018-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多