Javascript ExtJS:如何防止GridPanel中的列数总和超过给定的最大值?
我有一个GridPanel,只有两列:名称和佣金百分比。所有百分比的总和不应超过预定的最大值(比如25%的销售额可供购买) 我在NumberField编辑器上附加了一个(请参阅“validator”),它非常适用于单个值的复杂逻辑,并且我可以轻松地汇总数据存储中数字列的所有值。但问题在于两者的结合;直到验证成功后,新值才会推送到存储区,并且自定义验证器只会得到当前值,而没有涉及到哪一行的上下文(我可能会减去旧值,并在总数中使用这个新值) 我如何让这个验证器以这样一种方式工作,即它确保新输入的值不会使总和超过最大值Javascript ExtJS:如何防止GridPanel中的列数总和超过给定的最大值?,javascript,extjs,coolite,Javascript,Extjs,Coolite,我有一个GridPanel,只有两列:名称和佣金百分比。所有百分比的总和不应超过预定的最大值(比如25%的销售额可供购买) 我在NumberField编辑器上附加了一个(请参阅“validator”),它非常适用于单个值的复杂逻辑,并且我可以轻松地汇总数据存储中数字列的所有值。但问题在于两者的结合;直到验证成功后,新值才会推送到存储区,并且自定义验证器只会得到当前值,而没有涉及到哪一行的上下文(我可能会减去旧值,并在总数中使用这个新值) 我如何让这个验证器以这样一种方式工作,即它确保新输入的值不
Name Commission
Bob 10%
Sally 16% (Invalid! Total commissions must not exceed 25%)
(Maximum is 25%)
在将更改的元素保存到数据库之前,需要先拉入该元素的脏值。事后验证clean值是没有意义的 有关ExtJS中数据存储的信息,请参见此处:
您可以使用属性,例如
field.originalValue
和field.getRawValue()
来访问数据存储并查看差异。我没有完全使用js1568的答案,因为我想在输入错误值时阻止它们;甚至在AfterEdit事件触发和行被标记为脏之前,以及在写入数据库之前很久。但通过使用网格的选择模型确实启发了我。因此,我的快速小解决方案:
因为NumberField不会将任何上下文传递给自定义验证器(除了当前值),所以使用field.originalValue
会非常棒,但是,生活很艰难
但由于编辑一行首先需要选择该行(并且由于此网格的RowSelectionModel设置为SingleSelect
),我知道正在编辑的行必须是grid.selModel.selections.items[]
中的唯一元素。从那以后,这只是一个时间问题
var newTotal = TotalCommissionPercentagesInGrid() – oldValue + newValue;
oldValue
为grid.selModel.selections.items[0]。data.CommissionPercentage
和newValue
为从NumberField传递给验证器函数的值
return ( newTotal <= percentageAvailable ) ? true : "No dice.";
return(新总数
return ( newTotal <= percentageAvailable ) ? true : "No dice.";