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

时间:2010-08-26 16:18:04

标签: javascript extjs coolite

我有一个只有两列的GridPanel:名称和佣金百分比。所有百分比的总和不应超过预定的最大值(例如,25%的销售额用于争夺)。

Name          Commission
Bob           10%
Sally         15%

(Maximum is 25%)
Everything is fine.

我已经将custom validator(参见“验证器”)附加到NumberField编辑器,该编辑器非常适合单个值的复杂逻辑,我可以总结数据中数字列的所有值很容易存储。但问题是将两者结合起来;在成功验证之后,新值不会被推送到商店,并且自定义验证器仅被赋予相关的当前值,而没有关于涉及哪个行的上下文(我可以使用该值来减去旧值,以及在总数中使用这个新值。

如何让这个验证器工作,以确保新输入的值不会超过最大值?

Name          Commission
Bob           10%
Sally         16% (Invalid!  Total commissions must not exceed 25%)

(Maximum is 25%)

2 个答案:

答案 0 :(得分:0)

在将已更改元素的脏值保存到数据库之前,需要将其拉入。事后验证清洁值是没有意义的。

有关ExtJS中数据存储的信息,请参阅此处:

http://www.fusioncube.net/index.php/managing-dirty-rows-in-a-sencha-extjs-editorgridpanel

您可以使用field.originalValuefield.getRawValue()等属性来获取数据存储并查看差异。

答案 1 :(得分:0)

我没有完全使用js1568的答案,因为我想阻止错误的值,因为它们正在输入;甚至在AfterEdit事件触发之前,行被标记为脏,并且在写入数据库之前很久。但是that link通过使用网格的选择模型确实激励了我。所以,我的快速小解决方案:

因为NumberField没有将任何上下文传递给自定义验证器(除了当前值),使用field.originalValue本来就很棒,但是嘿,生活很难。

但由于编辑行首先需要选择该行(并且由于此网格的RowSelectionModel设置为SingleSelect而得到加强),因此我知道正在编辑的行必须是唯一的元素在grid.selModel.selections.items[]。从那里,这只是一个问题

var newTotal = TotalCommissionPercentagesInGrid() – oldValue + newValue;

oldValuegrid.selModel.selections.items[0].data.CommissionPercentagenewValue为从NumberField传递给验证程序函数的值。

return ( newTotal <= percentageAvailable ) ? true : "No dice.";

非常好。