ExtJS findExact()和自定义验证程序错误

ExtJS findExact()和自定义验证程序错误,extjs,combobox,extjs4,Extjs,Combobox,Extjs4,我正在组合框上使用自定义验证器: function(v) { console.log(v === 'some value I know for SURE is in the store'); // (1) var index = this.getStore().findExact(this.displayField, v); return (index!==-1) ? true : 'Invalid selection'; } 基本上允许与相同的设置,但允许用户键入任意

我正在组合框上使用自定义验证器:

function(v) {
    console.log(v === 'some value I know for SURE is in the store'); // (1)
    var index = this.getStore().findExact(this.displayField, v);
    return (index!==-1) ? true : 'Invalid selection';
}
基本上允许与相同的设置,但允许用户键入任意文本以尝试自动完成

但是,;我在
findExact()
中得到了非常奇怪的结果。例如,如果组合框的值当前为有效,并且用户执行空格+退格,则即使(1)的输出为,验证器仍将失败


你知道是什么导致了这个问题吗?最终体验目前非常混乱。

当您键入额外空间时,存储将被过滤。在按下backspace键并激活验证程序后,存储区仍然为空

若您有本地存储,那个么您可以在每次更改后延迟验证组合。例如:

listeners: {
    change: function() {
        this.validate();
    },
    delay: 100
}
这应该足够了

另一方面,如果您有远程存储,请尝试以下操作:

validator: function(v) {
    var store = this.getStore(),
        index = store.findExact(this.displayField, v);

    if (index === -1 && store.isLoading()) {
        store.on('load', function() {
            this.validate();
        }, this, { single: true, delay: 100 });
    }

    return (index !== -1) ? true : 'Invalid selection';
}

我只是在这个问题上花了几天时间,找到了一个非常好的解决方案(真的是偶然的)。正如公认的答案所建议的那样,您可以利用提供的
验证程序
功能;然而,据我所知,有一个比公认的答案简单得多的解决方案:评估用户提供的输入是否等于存储中的值(这是原始帖子中的基本问题)

以这种方式考虑输入的好处是,它使我们能够处理用户输入的无效值(已验证;无值)的用例,并且在字段失去焦点后,Ext JS将字段设置回其以前的值(记住其存储值)

这与您的想法完全不同,但它应该有效,尤其是当
.validate()
运行时,无论您是否提供了
验证器
过程的实现:

validator : function(someParam) {
    if(this.value === null) {
        return "error message"; //falsy
    } else {
        return true;
    }
}

如果启用
forceSelection
,则上述操作非常有效,并消除了bug的感觉。这使您可以依靠
.validate
在其他地方发挥其神奇作用(注意,我甚至没有调用它;阅读文档,以确定它在与
验证器的关系中何时被调用)而且不必担心用户在接受的答案中正确地解释了什么。

在用户完成键入之前,我们在清除用户文本方面遇到了问题。我们似乎通过设置forceSelection为false并检查他们是否选择了某些内容来获得所需的内容

validator: function(v) {
    if (this.getSelection() === null) {
        return 'invalid text';
    }else{
        return true;
    }
}

我有一个类似的问题,发现了这个条目。我的问题是,我在多个组合框中重用了同一个商店实例。在给每个组合框一个自己的存储克隆数据后,一切都很好。 另见:

关于应用于商店的过滤器,您是正确的。
延迟
没有解决这一问题;但是,调用
clearFilter()
didHi Thomas,您是否也在谈论ext4或更高版本?