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

时间:2013-11-10 02:12:51

标签: 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';
}

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

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

任何想法导致问题的原因是什么?终极体验目前非常错误......

4 个答案:

答案 0 :(得分: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';
}

答案 1 :(得分:1)

我有一个类似的问题并找到了这个条目。我的问题是,我在多个ComboBox上重用了相同的商店实例。给每个ComboBox一个拥有克隆数据的商店后,一切都很好。 也可以看看: https://www.sencha.com/forum/showthread.php?305182-ComboBox-forceSelection-clears-input&p=1127218&viewfull=1#post1127218

答案 2 :(得分:0)

我刚刚在这个问题上花了几天时间,发现了一个非常好的解决方案(真的很偶然)。您可以 - 正如接受的答案建议 - 利用提供的validator功能;但是,根据我的理解,有一个比接受的答案提供的更简单的解决方案:评估用户提供的输入是否等于商店中的值(这是原始帖子中的基本问题)。

以这种方式思考输入的优点是它使我们能够处理用户输入的无效值的用例(经验证;没有值)和 - 在字段失去焦点后 - Ext JS设置字段返回其先前的值(记住其商店价值)。

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

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

如果你启用forceSelection,上面的工作非常好,并摆脱了错误的感觉。这允许你依靠.validate在其他地方发挥它的魔力(注意我甚至不称它;阅读文档以确定何时调用它与validator的关系)而不必担心用户在接受的答案中正确解释了什么。

答案 3 :(得分:0)

我们在使用forceSelection清除用户文本之前遇到了麻烦。我们似乎通过设置forceSelection false得到我们需要的东西,只是检查他们选择了什么。

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