0

名前と手数料率の2つの列しかないGridPanelがあります。すべてのパーセンテージの合計は、事前に決定された最大値を超えてはなりません(たとえば、売り上げの25%が獲得可能です)。

Name          Commission
Bob           10%
Sally         15%

(Maximum is 25%)
Everything is fine.

カスタムバリデーター(「バリデーター」を参照)をNumberFieldエディターにアタッチしました。これは、個々の値の複雑なロジックに最適であり、データストアの数値列のすべての値を簡単に合計できます。しかし、問題は2つを組み合わせることにあります。新しい値は検証が成功するまでストアにプッシュされず、カスタムバリデーターには問題の現在の値のみが与えられ、どの行が関係しているか(古い値を差し引く可能性があります)に関するコンテキストはありません。合計でこの新しい値を使用します)。

新しく入力した値が合計を最大値を超えないように、このバリデーターを機能させるにはどうすればよいですか?

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

(Maximum is 25%)
4

2 に答える 2

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 に答える
0

データベースに保存する前に、変更された要素のダーティ値を取得する必要があります。クリーンな値を事後に検証しても意味がありません。

ExtJS でのデータ ストレージに関する情報については、こちらを参照してください。

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

field.originalValueやなどのプロパティを使用field.getRawValue()してデータ ストアを取得し、違いを確認できます。

于 2010-08-26T16:26:27.853 に答える