0

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

Name          Commission
Bob           10%
Sally         15%

(Maximum is 25%)
Everything is fine.

我已将自定义验证器(请参阅“验证器”)附加到 NumberField 编辑器,该编辑器非常适用于单个值的复杂逻辑,并且我可以轻松总结数据存储中数字列的所有值。但问题在于将两者结合起来。直到成功验证后,新值才会推送到商店,并且自定义验证器仅给出当前存在的值,没有关于所涉及行的上下文(我可能会减去旧值,并且在总数中使用这个新值)。

我怎样才能让这个验证器以确保新输入的值不会使总和超过最大值的方式工作?

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

(Maximum is 25%)
4

2 回答 2

0

在将更改元素保存到数据库之前,您需要提取已更改元素的脏值。事后验证干净的值是没有意义的。

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

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

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

于 2010-08-26T16:26:27.853 回答
0

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

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

但由于编辑行首先需要选择该行(并且该网格的 RowSelectionModel 设置为 的事实加强了这一事实SingleSelect),我知道正在编辑的行必须是grid.selModel.selections.items[]. 从那里开始,这只是一个问题

var newTotal = TotalCommissionPercentagesInGrid() – oldValue + newValue;

从NumberField 传递给验证器函数的oldValuegrid.selModel.selections.items[0].data.CommissionPercentagenewValue

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

非常好。

于 2010-08-26T19:39:53.643 回答