我正在试图找出一个名为selectize.js的基于jQuery的简洁库的工作方式。
在演示页面上,他们有一个“createFilter”函数的示例,我想用它来检查用户输入是否已经存在,如果没有,则创建该项目。
selectize.js的例子(用于电子邮件):
createFilter: function(input) {
var match, regex;
// email@address.com
regex = new RegExp('^' + REGEX_EMAIL + '$', 'i');
match = input.match(regex);
if (match) return !this.options.hasOwnProperty(match[0]);
// name <email@address.com>
regex = new RegExp('^([^<]*)\<' + REGEX_EMAIL + '\>$', 'i');
match = input.match(regex);
if (match) return !this.options.hasOwnProperty(match[2]);
return false;
},
我自己采取过滤器只允许字母,并检查它是否已经在列表中:
createFilter: function (input) {
var match, regex;
regex = new RegExp('^[a-zA-ZæøåÆØÅ][a-zA-ZæøåÆØÅ ]*[a-zA-ZæøåÆØÅ]$', 'i');
match = input.match(regex);
if (match) return !this.options.hasOwnProperty(match[0]);
return false;
},
由于某种原因,它总是返回true
,因此允许用户添加一个新项目,即使它已经存在,经过数小时的测试,我确信它与this.options.hasOwnProperty有关。 - 但我已经走到了尽头,弄清楚是什么以及为什么,任何帮助或指导都会受到高度赞赏。
答案 0 :(得分:1)
我一直在努力让createFilter工作,并查看源代码,但事情似乎设置正确,但某处有一个明显的错误。现在我的解决方案是使用实际的create方法。如果你在源代码中挖掘一下(由创建选项的文档提到),你会注意到在创建项目之前它将检查你的create值是否是一个函数:
var setup = (typeof self.settings.create === 'function') ? this.settings.create : function(input) {
var data = {};
data[self.settings.labelField] = input;
data[self.settings.valueField] = input;
return data;
};
通过传入一个只在传递某个条件时才返回数据值的创建函数,否则返回{},你可以有效地完成你想在createFilter函数中做的事情。
$('#foo').selectize({
create: function(input){
var self = this;
var data = {};
// IF SOME CONDITION MET
if (bar) {
data[self.settings.labelField] = input;
data[self.settings.valueField] = input;
}
return data;
},
});
如果数据以{}形式返回,则不会创建该项目,并且用户可以根据需要继续修改它(或者被告知选择无效)。