我有一个只有两列的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%)
答案 0 :(得分:0)
在将已更改元素的脏值保存到数据库之前,需要将其拉入。事后验证清洁值是没有意义的。
有关ExtJS中数据存储的信息,请参阅此处:
http://www.fusioncube.net/index.php/managing-dirty-rows-in-a-sencha-extjs-editorgridpanel
您可以使用field.originalValue
和field.getRawValue()
等属性来获取数据存储并查看差异。
答案 1 :(得分:0)
我没有完全使用js1568的答案,因为我想阻止错误的值,因为它们正在输入;甚至在AfterEdit事件触发之前,行被标记为脏,并且在写入数据库之前很久。但是that link通过使用网格的选择模型确实激励了我。所以,我的快速小解决方案:
因为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.";
非常好。