无论如何,在我看来,最好的方法就是编写自己的编辑器,将其作为另一个新的自定义编辑器添加到slick.editor.js
中。这个文件也是为此而设计的。我确实实施了正则表达式测试,效果很好。
这是我的新的编辑器,不仅工作正则表达式也为各种条件类型,例如min:2
的选择将需要2的最小数目,而minLength:2
将所需的输入是一个字符串至少2个字符等...现在对于您真正需要的那个,那将在我的代码定义pattern
类型中。 所以基本上,你必须包含这个代码slick.editor.js
内:
ConditionalCellEditor : function(args) {
var $input;
var defaultValue;
var scope = this;
var condObj = null;
this.init = function() {
$input = $("<INPUT type='text' class='editor-text' />")
.appendTo(args.container)
.bind("keydown.nav", function(e) {
if (e.keyCode === $.ui.keyCode.LEFT || e.keyCode === $.ui.keyCode.RIGHT) {
e.stopImmediatePropagation();
}
})
.focus()
.select();
};
this.destroy = function() {
$input.remove();
};
this.focus = function() {
$input.focus();
};
this.getValue = function() {
return $input.val();
};
this.setValue = function(val) {
$input.val(val);
};
this.loadValue = function(item) {
defaultValue = item[args.column.field] || "";
$input.val(defaultValue);
$input[0].defaultValue = defaultValue;
$input.select();
};
this.serializeValue = function() {
return $input.val();
};
this.applyValue = function(item,state) {
item[args.column.field] = state;
};
this.isValueChanged = function() {
return (!($input.val() == "" && defaultValue == null)) && ($input.val() != defaultValue);
};
this.validate = function() {
var condObj = args.column.editorOptions;
var returnMsg = null;
var returnValid = true;
if(typeof condObj.min != 'undefined') {
if(parseFloat($input.val()) < parseFloat(condObj.min)) {
returnMsg = "Value should not be less then "+condObj.min;
returnValid = false;
}
}
if(typeof condObj.max != 'undefined') {
if(parseFloat($input.val()) > parseFloat(condObj.max)) {
returnMsg = "Value should not be over "+condObj.max;
returnValid = false;
}
}
if(typeof condObj.minLength != 'undefined') {
if($input.val().length < condObj.minLength) {
returnMsg = "Value length should not be less then "+condObj.minLength;
returnValid = false;
}
}
if(typeof condObj.maxLength != 'undefined') {
if($input.val().length > condObj.maxLength) {
returnMsg = "Value length should not be over "+condObj.maxLength;
returnValid = false;
}
}
if(typeof condObj.pattern != 'undefined') {
if(condObj.pattern.test($input.val()) != true) {
returnMsg = (condObj.msg) ? condObj.msg : "Value is invalid following a regular expression pattern";
returnValid = false;
}
}
if(typeof condObj.required != 'undefined') {
if($input.val().length == "" && condObj.required) {
returnMsg = "Required field, please provide a value";
returnValid = false;
}
}
// Now let's return our boolean results and message if invalid
return {
valid: returnValid,
msg: returnMsg
}
};
this.init();
},
然后我SlickGrid列定义里面我打电话的,是我定义的新的编辑器传递一些选项,我决定通过成editorOptions
作为一个对象,这给了我更多的灵活性,以添加我想要的任何选项,模式,味精,minLength,等等...都在一个。我的例子是一个电子邮件正则表达式模式验证。
columns1 = [
...
{id:"email", field:"email", name:"[email protected]", width:145, editor:ConditionalCellEditor, editorOptions:{pattern:/^([0-9a-zA-Z]+([_.-]?[0-9a-zA-Z]+)*@[0-9a-zA-Z]+[0-9,a-z,A-Z,.,-]*(.){1}[a-zA-Z]{2,4})+$/, msg:"Must be a valid email"} },
...];
而voilà,作品像魅力! 我几乎不再使用editor:TextCellEditor
,因为我的新ConditionalCellEditor
编辑器给了我更多的灵活性。希望它有帮助,让我知道它是怎么回事...
当然,你可以编辑要传递任何你想要的东西。就像在某处添加一个验证设置对象到args.column并将其传递到args.column.validator的第二个参数而不是$ input。 – 2012-02-07 17:45:02
没有得到它。 'slick.editors.js'中有标准的验证器。我需要指定我自己的吗?以及代码如何代替'validator:requiredFieldValidator' – 2012-02-07 18:05:37
默认情况下,slickGrid只会将输入的值传递给自定义的验证器方法,所以'args.column.validator($ input.val());'是当前的只将值传递给你的'requiredFieldValidator'。你的代码仍然看起来像'validator:requiredFieldValidator',但是它会引用'function requiredFieldValidator(value,input)' 你会希望正则表达式在输入中首先被定义为一个属性。 – 2012-02-07 18:14:46