ExtJS 4:从分组存储中呈现自定义视图,并为分组命名
ExtJS 4: rendering a custom view from a grouped store with a title for the grouping
我正在将一个带有自定义字段的存储分组到模型中的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>'
我知道模板目前不会输出我需要的东西,但不确定如何在视图中分组标题的记录。
我知道问题是5岁,但我有同样的要求。所以我已经解决了同样的问题,并从我的结束得到了解决方案,所以我在这里分享。
对于XTemplate
内部,您需要检查if
条件以显示日期组的共同标头,并处理一个variable
以检查date-group
的类型。
如何检查条件是否检查tpl
?参见下面的例子:-
'<tpl for="kids">',
'<tpl if="age > 1">',
'<p>{name}</p>',
'<p>Dad: {parent.name}</p>',
'</tpl>',
'</tpl></p>'
在这个FIDDLE中,我使用Ext.view创建了一个演示。查看,存储,建模和面板。我希望这能帮助或指导你/其他人达到你的要求。
<<p> 代码片段/strong>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);
}
}
});
}
});
相关文章:
- 如何在ExtJs4应用程序上为视图、存储和模型设置自定义文件夹名称
- 遍历SC.ManyArrray以创建要附加到SproutCore中的另一个视图的自定义视图
- 基于月份视图的完整日历自定义视图
- 自定义筛选器不'我不使用django数据表视图创建的ajax.data.Json
- Meteor JS自动表单自定义输入-没有当前视图
- Kendo UI自定义验证不适用于模板和视图模型
- 正在将逻辑从视图移动到自定义绑定
- Angular2 在创建 ngSwitch 新视图后调用自定义函数
- 挖空绑定自定义组件,使其不与中心视图模型冲突
- 如何在 JQuery Mobile 中的列表视图中拥有自定义按钮
- 在 Angular JS 中创建自定义指令时,值在视图上不可用
- jQuery 图层选择器类型插件或可自定义的列表视图插件
- 用于引导程序选择的挖空自定义绑定,不更新视图模型“选定类别/选定类别”
- 使用 Aurelia在视图中动态生成自定义组件
- Ember.js自定义组件或视图
- 如何从视图中触发事件(自定义事件)并在 Ext JS 的控制器中处理它们
- 允许 HTML 的角度树视图中的自定义标签
- 使用原版 JavaScript 的自定义可调整大小的弹性框视图在鼠标按下时跳转
- 获取点击列表视图项的自定义数据属性;弹出;JQM.
- 网格视图自定义控件和 JavaScript 函数 c#