在Selectize createFilter中使用JavaScript hasOwnProperty的问题

时间:2014-11-28 23:51:03

标签: javascript jquery selectize.js

我正在试图找出一个名为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有关。 - 但我已经走到了尽头,弄清楚是什么以及为什么,任何帮助或指导都会受到高度赞赏。

1 个答案:

答案 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;
    },
 });

如果数据以{}形式返回,则不会创建该项目,并且用户可以根据需要继续修改它(或者被告知选择无效)。