【问题标题】:ExtJS 4: rendering a custom view from a grouped store with a title for the groupingExtJS 4:从分组商店渲染自定义视图,并带有分组标题
【发布时间】:2012-12-26 12:53:14
【问题描述】:

我正在使用添加到模型中的 JSON 数据记录中的自定义字段对商店进行分组:

Ext.define('SCB.RMWB.InfoBar.Model.Message', {
    extend: 'Ext.data.Model',
    idProperty: 'Message',
    fields: [
        {name: 'id',                type: 'int'},
        {name: 'source',            type: 'string'},
        {name: 'target',            type: 'string'},
        {name: 'sourceType',        type: 'string'},
        {name: 'redirectUrl',       type: 'string'},
        {name: 'message',           type: 'string'},
        {name: 'targetType',        type: 'string'},
        {name: 'messageType',       type: 'string'},
        {name: 'sentDate',          type: 'int'},
        {name: 'notificationType',  type: 'string'},
        {name: 'parameters',        type: 'string'},
        {name: 'read',              type: 'boolean'},
        {name: 'readDate',          type: 'int'},
        {
            name: 'dateGroup',
            type: 'string',
            convert: function(value, record) {   

                var formattedSentDate =  dateHelpers.format(record.get('sentDate')),
                    str = '';

                if (formattedSentDate === dateHelpers.today()) {
                    str = 'Today';
                } else if (formattedSentDate === dateHelpers.yesterday()) {
                    str = 'Yesterday';
                } else {
                    str = 'Last week';
                }

                return str;

            }
        }

    ],
    validations: [
        {type: 'presence',          field: 'id'},
        {type: 'presence',          field: 'source'},
        {type: 'presence',          field: 'target'},
        {type: 'presence',          field: 'sourceType'},
        {type: 'presence',          field: 'redirectUrl'},
        {type: 'presence',          field: 'message'},
        {type: 'presence',          field: 'targetType'},
        {type: 'presence',          field: 'messageType'},
        {type: 'presence',          field: 'sentDate'},
        {type: 'presence',          field: 'notificationType'},
        {type: 'presence',          field: 'parameters'},
        {type: 'presence',          field: 'read'},
        {type: 'presence',          field: 'readDate'},
        {type: 'presence',          field: 'dateGroup'}
    ]
});

所以很明显,所需的分组是今天昨天上周

这似乎工作正常,但我需要以手风琴方式呈现分组,并带有表示分组的标题。

目前模板每次输出日期分组,我需要一次分组标题,然后是属于该分组的那些记录。

这是当前模板:

    '<tpl for=".">',
        '<li class="view-all-details">',
            '<h3>{dateGroup}</h3>',
            '<div>',
                '<p>{[ Ext.util.Format.ellipsis(values.message, 100, true) ]}</p>', 
                '<span class="time-frame">{[ SCB.RMWB.Infobar.utils.dateRangeMsg(values.sentDate) ]}</span>',
            '</div>',
        '</li>',                        
    '</tpl>'    

我知道模板当前不会输出我需要的内容,但不确定如何将视图中的记录与标题分组。

【问题讨论】:

    标签: javascript json templates extjs view


    【解决方案1】:

    我知道问题是 5 岁,但我有同样的要求。所以我已经解决了同样的问题并从我的角度得到了解决方案,所以我在这里分享。

    对于XTemplate 内部,您需要检查if 条件以显示日期组的公共标头并处理一个variable 以检查date-group 的类型。

    如何检查条件检查tpl?见下面的例子:-

    '<tpl for="kids">',
            '<tpl if="age &gt; 1">',
                '<p>{name}</p>',
                '<p>Dad: {parent.name}</p>',
            '</tpl>',
        '</tpl></p>'
    

    在这个FIDDLE中,我使用Ext.view.Viewstoremodelpanel创建了一个演示。我希望这将帮助或指导您/其他人实现您的要求。

    代码片段

    Ext.application({
        name: 'Fiddle',
    
        launch: function () {
    
            var message = [],
                date,
                date1;
            /*
             * function will calculate diffrence b/w 2 dates
             * @param{Date} min
             * @param{Date} max
             * @return number
             */
            function dayDiff(min, max) {
                return Math.round((max - min) / (1000 * 60 * 60 * 24))
            }
    
            //createing demo message for testing
            for (var i = 0; i < 12; i++) {
                if (i < 4) {
                    date = Date.now();
                } else if (i >= 4 && i < 8) {
                    date1 = new Date();
                    date = date1.setDate(date1.getDate() - 1);
                } else {
                    date1 = new Date();
                    date = date1.setDate(date1.getDate() - 2);
                }
                message.push({
                    text: `Hello I am message ${i+1}`,
                    sentdate: Ext.Date.clearTime(new Date(date)),
                    id: i + 1
                })
            }
    
            //Create Message model
            Ext.define('Message', {
                extend: 'Ext.data.Model',
                fields: ['id', 'text', {
                        name: 'sentdate',
                        type: 'date'
                    }, {
                        name: 'dateGroup',
                        type: 'string',
                        convert: function (value, record) {
                            var sentDate = record.get('sentdate'),
                                str,
                                diff = dayDiff(new Date(sentDate), Ext.Date.clearTime(new Date()));
                            if (diff == 0) {
                                str = 'Today';
                            } else if (diff == 1) {
                                str = 'Yesterday';
                            } else {
                                str = 'Last week';
                            }
                            return str;
                        }
                    }
                    /*, {
                                        name: 'group',
                                        type: 'int',
                                        mapping: 'dateGroup',
                                        convert: function (value, rec) {
                                            switch (rec.get('dateGroup')) {
                                            case 'Today':
                                                value = 0;
                                                break;
                                            case 'Yesterday':
                                                value = 1;
                                                break;
                                            default:
                                                value = 2
                                            }
                                            return value;
                                        }
                                    }*/
    
                ],
                // sort: 'group'
            });
            //create message store
            Ext.create('Ext.data.Store', {
                storeId: 'message',
                model: 'Message'
            });
    
            //Create data view
            //we can also use using xtype:'dataview' inside of items
            var view = Ext.create('Ext.view.View', {
                height: window.innerHeight,
                //overflowY: 'auto',
                store: 'message',
                tpl: new Ext.create('Ext.XTemplate',
                    '<tpl for=".">',
                    '<tpl if="this.isSameGroup(values.dateGroup)"><div class="x-group-header"><b>{[this.doShowGroup(values.dateGroup)]}</div></b></tpl>',
                    '<div class="x-message-item ">{text} <span>{[Ext.Date.format(values.sentdate,"d M y")]}<span></div>',
                    '</tpl>', {
                        isSameGroup: function (group) {
                            return this.currentGroup != group;
                        },
                        doShowGroup: function (group) {
                            this.currentGroup = group;
                            return group;
                        }
                    }),
                itemSelector: '.x-message-item',
                emptyText: 'No data available',
                renderTo: Ext.getBody()
            });
            //create panel
            Ext.create('Ext.panel.Panel', {
                title: 'Rendering a custom view from a grouped store with a title for the grouping',
                items: [view],
                renderTo: Ext.getBody(),
                listeners: {
                    afterrender: function () {
                        this.down('dataview').getStore().loadData(message);
                    }
                }
            });
    
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-18
      • 2015-02-06
      • 2013-02-03
      • 2019-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多