【发布时间】:2011-01-27 07:43:03
【问题描述】:
我有一个 ExtJS TimeField,我使用 setMinValue(...) 和 setMaxValue(...) 只向用户显示有效的时间元素。这工作得很好,但是如何重置 minValue 和 maxValue 以便用户可以再次看到所有时间元素?
我不想清除该字段,只是再次显示商店中的所有元素。
【问题讨论】:
我有一个 ExtJS TimeField,我使用 setMinValue(...) 和 setMaxValue(...) 只向用户显示有效的时间元素。这工作得很好,但是如何重置 minValue 和 maxValue 以便用户可以再次看到所有时间元素?
我不想清除该字段,只是再次显示商店中的所有元素。
【问题讨论】:
我没有看到任何“干净”的方法来实现这一点,但我确实有一个临时的解决方法,直到你找到更合适的方法。
尝试将TimeField 的minValue 和maxValue 设置为undefined 或null,然后在您的TimeField 上调用generateStore():
// private
generateStore: function(initial){
var min = this.minValue || new Date(this.initDate).clearTime(),
max = this.maxValue || new Date(this.initDate).clearTime().add('mi',
(24 * 60) - 1),
times = [];
while(min <= max){
times.push(min.dateFormat(this.format));
min = min.add('mi', this.increment);
}
this.bindStore(times, initial);
},
是的,它是一个私有方法,所以通常你不应该使用它,但是如果你简单地重置 minValue 或 maxValue,通常会调用该方法,所以你只是跳过了一个步骤。通过将这两个属性都设置为 null,var min, max = 的声明将等于默认值。您不能通过调用 setMinValue() 或 setMaxValue() 来解决此问题,因为它使用私有方法尝试从您传递给方法的值中解析日期(解析 null 时将失败):
// private
setLimit: function(value, isMin, initial){
var d;
// will fail here
if(Ext.isString(value)){
d = this.parseDate(value);
// will fail as well
}else if(Ext.isDate(value)){
d = value;
}
// will never make it here, because 'd' wasn't set above
if(d){
var val = new Date(this.initDate).clearTime();
val.setHours(d.getHours(), d.getMinutes(), d.getSeconds(),
d.getMilliseconds());
this[isMin ? 'minValue' : 'maxValue'] = val;
if(!initial){
this.generateStore();
}
}
}
更新:
更简洁的方法是扩展 TimeField 并添加一个完成上述操作的 resetMinAndMax 方法(将 minValue/maxValue 设置为 null,调用生成存储),或者在覆盖中添加该方法。这样你就可以避免到处打电话给“私人”generateStore()。
【讨论】:
setMinValue 和 setMaxValue 的传入参数以查看如果它包含null 或undefined 或类似的,然后采取相应的行动。不过非常感谢您的详尽回答!
TimeField,是否可以使用类似的、也许更好的方法来添加 resetMinValue 和 resetMaxValue 到 TimeField 的原型?我的理由是,我看不到重置方法不方便或至少不相关的情况。
你可以简单地使用
this.setMinValue(false);
祝你好运
【讨论】:
extjs 仅从组件重置属性“值”(如果我没记错的话),好吧,我不知道我的代码是否是更好的方法,但是..就像上面的答案一样,我覆盖了使用 Field 类的代码从 DateField 类中重置方法,并添加另外 2 个属性以保留原始值(originalMinValue 和 originalMaxValue)。
originalMinValue 和 originalMaxValue 是在我的日期字段的 onRender 事件中启动的。
this.setValue = this.setValue.createSequence(this.updateHidden);
this.originalMinValue = this.minValue;
this.originalMaxValue = this.maxValue;
// this is part of me onRender event code
这就是覆盖
Ext.override(Ext.form.DateField,{
originalMinValue : null,
originalMaxValue : null,
reset : function() {
this.setValue(this.originalValue);
this.setMinValue(this.originalMinValue);
this.setMaxValue(this.originalMaxValue);
this.clearInvalid();
}
})
这样,我们就可以使用组件的reset方法e then、value、minValue、MaxValue回到原来的Value了。
抱歉我的英语不好。
【讨论】:
页面加载时,您是否在跟踪时间字段的初始值?如果是这种情况,您应该能够使用 FIELD 类的 reset() 方法。您应该可以访问它,因为 timefield 组件是从 FIELD 扩展而来的。
【讨论】: