ExtJS: Как я могу предотвратить превышение заданного максимума суммы столбцов числа в GridPanel? - PullRequest
0 голосов
/ 26 августа 2010

У меня есть 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%)

Ответы [ 2 ]

0 голосов
/ 26 августа 2010

Я не совсем использовал ответ 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.";

Очень мило.

0 голосов
/ 26 августа 2010

Необходимо сохранить грязное значение измененного элемента, прежде чем он будет сохранен в базе данных. Не имеет смысла проверять чистое значение после факта.

См. Здесь информацию о хранении данных в ExtJS:

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

Вы можете использовать такие свойства, как field.originalValue и field.getRawValue(), чтобы попасть в хранилище данных и увидеть разницу.

...