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或更高版本?