我正在努力使用具有可编辑单元格(CellEditing plugin)的ExtJS 4.1.1 grid
。
一个人应该能够在单元格中键入数学公式,并且应该将结果生成到字段的值中。例如:如果用户输入(320*10)/4
,则返回值应为800
。或类似如果用户键入(320m*10cm)/4
,该函数应从公式中去除非数学字符,然后计算它。
我希望用RegExp替换(或匹配),但我似乎无法让它工作。它一直返回NaN,当我console.log(e.value);
时,它只返回originalValue
而不是我需要的value
。
我没有太多要附加的代码:
onGridValidateEdit : function(editor,e,opts) {
var str = e.value.toString();
console.log(str);
var strCalc = str.match(/0-9+-*\/()/g);
console.log(strCalc);
var numCalc = Number(eval(strCalc));
console.log(numCalc);
return numCalc;
},
当我输入str=321
时,会返回strCalc=null
numCalc=0
321*2
。
任何帮助表示赞赏,
GR。
基于Paul Schroeder的input,我创造了这个:
onGridValidateEdit : function(editor,e,opts) {
var str = e.record.get(e.field).toString();
var strCalc = str.replace(/[^0-9+*-/()]/g, "");
var numCalc = Number(eval(strCalc));
console.log(typeof numCalc);
console.log(numCalc);
return numCalc;
},
计算数字,但我无法将其打印回网格本身。它显示为“NaN”,即使在控制台中它显示typeof=number
和value=800
。
这是最终的代码:
onGridValidateEdit : function(editor,e,opts) {
var fldName = e.field;
var str = e.record.get(fldName).toString();
var strCalc = str.replace(/[^0-9+*-/()]/g, "");
var numCalc = Number(eval(strCalc));
e.record.set(fldName,numCalc);
},
答案 0 :(得分:1)
让我们打破这段代码。
onGridValidateEdit : function(editor,e,opts) {
var str = e.value.toString();
这个代码使用的是什么监听器?这对我们来说非常重要,这是我在插件中设置监听器的方式:
listeners: {
edit: function(editor, e){
var record = e.record;
var str = record.get("your data_index of the value");
}
}
这样设置对我有用,所以让我们继续:
var strCalc = str.match(/0-9+-*\/()/g);
console.log(strCalc);
此时strCalc = null,这也是正确的。 str.match返回null,因为你的正则表达式与字符串中的任何内容都不匹配。我认为你想要做的是:
var strCalc = str.replace(/[^0-9+*-]/g, "");
console.log(strCalc);
这会将其更改为替换字符串中不是等式运算符和数字的所有字符。在那之后,我认为它应该适用于整数。我认为你实际上也可能想要十进制数字,但我无法想到正面的正则表达式(需要以某种方式转义),但它应该很简单,可以在谷歌搜索中找到