我突出显示日期选择器显示的一个月内的一些日期.这是通过向Picker组件添加highlightDates函数来完成的
Ext.override(Ext.form.field.Picker, {
highlightDates: function (picker, dates) {
if (Ext.isEmpty(dates)) return;
for(var i = 0; i < dates.length; i++) {
var t = new Date(dates[i].date),
dtMillis = t.getTime(),
offset = t.getTimezoneOffset() * 60 * 1000,
dt = dtMillis + offset,
cells = picker.cells.elements;
for (var c = 0; c < cells.length; c++) {
var cell = Ext.fly(cells[c]);
if (cell.dom.firstChild.dateValue == dt) {
cell.addCls('cell-highlight');
break;
}
}
}
}
});
Run Code Online (Sandbox Code Playgroud)
传递给上面函数的日期对象是来自控制器中的Ajax调用的变量集.
getDates: function (cmp) {
var me = this;
Ext.Ajax.request({
url: 'someurl',
success: function (response) {
me.specificDates = Ext.JSON.decode(response.responseText).specificDates;
}
});
}
Run Code Online (Sandbox Code Playgroud)
控制器还包含日期选择器扩展侦听器将调用的函数.
setDatesToHighlight: function(picker){
picker.highlightDates(picker.picker,this.specificDates);
}
Run Code Online (Sandbox Code Playgroud)
最后,使用展开侦听器使日期选择器可见时调用此方法
items: [{
xtype: 'datefield',
editable: false,
listeners: {
expand: 'setDatesToHighlight'
}
}]
Run Code Online (Sandbox Code Playgroud)
这一切都正常,直到我改变选择器中的月份.我似乎无法再次触发setDatesToHighlight控制器功能,因此选中的月份日期会突出显示.
我想我可以覆盖选择器上的更新方法,但我很难获得我需要传递给highlightDates函数的日期对象.
谢谢你的建议.
您可以通过覆盖Ext.picker.Date而不是Ext.form.field.Picker为update函数添加覆盖来触发每个更新的事件,如:
Ext.override(Ext.picker.Date, {
update: function (e) {
var res = this.callParent(arguments);
if (!this.pickerField) {
return res;
}
this.pickerField.fireEvent('update', this);
return res;
},
highlightDates: function (picker, dates) {
. . .
}
});
Run Code Online (Sandbox Code Playgroud)
现在您可以将侦听器更改expand为update.
工作示例:https://fiddle.sencha.com/#view/editor&fiddle/1l94