3

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

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';
}

基本上承认与forceSelection相同的集合,但允许用户键入任意文本以尝试自动完成。

然而; 我的结果很奇怪findExact()。例如,如果组合框的值当前是有效的,并且用户执行了空格 + 退格,则验证器将失败,即使 (1) 的输出为true

任何想法是什么导致了问题?最终体验目前非常糟糕。

4

4 回答 4

3

当您键入额外的空格时,存储被过滤。按退格键并触发验证器后,存储仍然是空的。

如果您有本地商店,那么您可以在每次更改后延迟验证组合。例子:

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';
}
于 2013-11-10T09:25:22.160 回答
1

我有一个类似的问题并找到了这个条目。我的问题是,我在多个 ComboBox 中重用了同一个商店实例。在为每个 ComboBox 提供一个包含克隆数据的自己的存储之后,一切都很好。另见: https ://www.sencha.com/forum/showthread.php?305182-ComboBox-forceSelection-clears-input&p=1127218&viewfull=1#post1127218

于 2016-02-04T10:16:43.110 回答
0

我只是在这个问题上花了几天时间,并找到了一个非常好的解决方案(真的是偶然)。您可以 - 正如公认的答案所暗示的那样 - 利用提供的validator功能;但是,据我了解,有一个比公认答案提供的更简单的解决方案:评估用户提供的输入是否等于商店中的值(这是原始帖子中的基本问题)。

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

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

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

如果您启用forceSelection,上述工作非常好,并且摆脱了错误的感觉。这使您可以依靠 来在.validate其他地方发挥其魔力(请注意,我什至没有调用它;阅读文档以了解何时调用它与validator),而不必担心用户在接受时正确解释了什么回答。

于 2015-02-16T15:31:00.500 回答
0

我们在 forceSelection 完成输入之前清除用户文本时遇到了问题。通过将 forceSelection 设置为 false 并检查他们是否选择了某些东西,我们似乎得到了我们需要的东西。

validator: function(v) {
    if (this.getSelection() === null) {
        return 'invalid text';
    }else{
        return true;
    }
}
于 2015-12-10T23:29:43.407 回答