2010-08-26 2 views
0

У меня есть GridPanel с двумя столбцами: именами и процентами комиссии. Сумма всех процентов никогда не должна превышать заданный максимум (скажем, что 25% продажи для захватов).ExtJS: Как я могу предотвратить совпадение суммы столбцов чисел в GridPanel от заданного максимума?

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

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

Очень приятно.

+0

Рад, что я указал вам в правильном направлении. Удачи – js1568

0

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

Смотрите здесь для получения информации о хранении данных в ExtJS:

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

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

Смежные вопросы