Javascript ExtJS:如何防止GridPanel中的列数总和超过给定的最大值?

Javascript ExtJS:如何防止GridPanel中的列数总和超过给定的最大值?,javascript,extjs,coolite,Javascript,Extjs,Coolite,我有一个GridPanel,只有两列:名称和佣金百分比。所有百分比的总和不应超过预定的最大值(比如25%的销售额可供购买) 我在NumberField编辑器上附加了一个(请参阅“validator”),它非常适用于单个值的复杂逻辑,并且我可以轻松地汇总数据存储中数字列的所有值。但问题在于两者的结合;直到验证成功后,新值才会推送到存储区,并且自定义验证器只会得到当前值,而没有涉及到哪一行的上下文(我可能会减去旧值,并在总数中使用这个新值) 我如何让这个验证器以这样一种方式工作,即它确保新输入的值不

我有一个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.";