【问题标题】:Extjs: (TimeField) reset minValue and maxValueExtjs: (TimeField) 重置 minValue 和 maxValue
【发布时间】:2011-01-27 07:43:03
【问题描述】:

我有一个 ExtJS TimeField,我使用 setMinValue(...)setMaxValue(...) 只向用户显示有效的时间元素。这工作得很好,但是如何重置 minValuemaxValue 以便用户可以再次看到所有时间元素?

我不想清除该字段,只是再次显示商店中的所有元素。

【问题讨论】:

    标签: extjs reset timefield


    【解决方案1】:

    我没有看到任何“干净”的方法来实现这一点,但我确实有一个临时的解决方法,直到你找到更合适的方法。

    尝试将TimeFieldminValuemaxValue 设置为undefinednull,然后在您的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()

    【讨论】:

    • @McStretch: 你的建议肯定是两种好方法,但我想知道他们为什么不检查 setMinValuesetMaxValue 的传入参数以查看如果它包含nullundefined 或类似的,然后采取相应的行动。不过非常感谢您的详尽回答!
    • @Chau:是的,我想这只是他们的疏忽。也许开发人员认为在构建组件后重置最小值/最大值是一个奇怪的用例。
    • @McStretch:除了扩展 TimeField,是否可以使用类似的、也许更好的方法来添加 resetMinValueresetMaxValueTimeField 的原型?我的理由是,我看不到重置方法不方便或至少不相关的情况。
    • @Chau:这听起来是个好主意。您可以使用 Ext.override() 添加这些方法:将函数列表添加到现有类的原型中,覆盖任何具有相同名称的现有方法。在我的旧项目中,我们有一个文件,其中保存了所有覆盖,以便我们可以轻松检查是否有人修改了 Ext 类的原型。
    【解决方案2】:

    你可以简单地使用

    this.setMinValue(false);
    

    祝你好运

    【讨论】:

      【解决方案3】:

      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了。

      抱歉我的英语不好。

      【讨论】:

        【解决方案4】:

        页面加载时,您是否在跟踪时间字段的初始值?如果是这种情况,您应该能够使用 FIELD 类的 reset() 方法。您应该可以访问它,因为 timefield 组件是从 FIELD 扩展而来的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-04-10
          • 2020-02-07
          • 2017-10-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-02-18
          相关资源
          最近更新 更多