我试图找出一个名为selectize.js的基于jQuery的简洁库的工作原理。

在演示页面上,他们有一个“ createFilter”功能的示例,我想用它来检查用户输入是否已经存在,如果不存在,请创建该项目。

selectize.js中的示例(适用于电子邮件):

createFilter: function(input) {
    var match, regex;

    // [email protected]
    regex = new RegExp('^' + REGEX_EMAIL + '$', 'i');
    match = input.match(regex);
    if (match) return !this.options.hasOwnProperty(match[0]);

    // name <[email protected]>
    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有关-但是我一无所获,弄清楚是什么,为什么,任何帮助或指导都将不胜感激。

最佳答案

我一直在尝试使createFilter也能正常工作,并调查了源代码,但是似乎安装正确,但是显然某个地方存在错误。现在,我的解决方案是使用实际的create方法。如果您在源代码中进行一些挖掘(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;
    },
 });


如果数据以{}返回,则不会创建该项目,并且用户可以继续根据需要对其进行修改(或被告知那里的选择无效)。

关于javascript - Selectize createFilter中的JavaScript hasOwnProperty问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27197343/

10-08 22:14