如何监听ExtJS中文本字段的用户编辑,而不是程序编辑

How to listen for user edits but not programmatic edits for textfield in Ext JS?

本文关键字:编辑 用户 程序 字段 文本 何监听 监听 中文 ExtJS      更新时间:2023-09-26

我在TextField上为change事件添加了一个监听器。当用户更改文本字段中的值时,我的侦听器将获得控制权。这太棒了。

在某些情况下,我希望恢复侦听器中的旧值。但是,当我在侦听器中调用setValue方法时,change事件再次触发。在不再次触发事件的情况下,以编程方式恢复旧值的最佳方法是什么?

您可以在TextField上设置标志,指示您通过程序更改值。例如:

new Ext.form.TextField({
    renderTo: 'container',
    listeners: {
        change: function(sender, newValue, oldValue) {
            if (this.restoringValue) {
                return;
            }
            if (newValue == 'XXX') {
                this.restoringValue = true;
                this.setValue(oldValue);
                delete this.restoringValue;
            }
        }
    },
    value: 'XXX'
});

如果您在变更监听器上没有任何缓冲区或延迟,那么它应该可以工作。

编辑事件处理程序以查看函数的caller。基于此,退出事件处理程序。

请参阅:如何获取调用方事件和dom元素id

setRawValue(对象值):对象

直接设置字段的原始值,绕过值转换、更改检测和验证。http://docs.sencha.com/ext-js/4-0/#/api/Ext.form.field.Base-method-setRawValue

我找到了一个解决方案来停止checkChange事件,它是checkChange事件查找的字段上的一个属性。是

field.suspendCheckChange=true

这是因为setValue方法触发的checkChange函数是

checkChange: function() {
        var me = this,
            newVal, oldVal;
        if (!me.suspendCheckChange) {
            newVal = me.getValue();
            oldVal = me.lastValue;
            if (!me.isDestroyed && me.didValueChange(newVal, oldVal)) {
                me.lastValue = newVal;
                me.fireEvent('change', me, newVal, oldVal);
                me.onChange(newVal, oldVal);
            }
        }
    },

这是在5.1中,不确定是否是早期版本。。

http://docs.sencha.com/extjs/5.1/5.1.1-apidocs/source/Field.html#Ext-表单字段字段方法检查更改