Eclipse Scout Neon в цикле обнаружения проверки набора значений

Я хочу проверить зависимости полей с другим полем, когда текущее поле изменилось.

Основная идея заключается в том, что если у меня есть поле A и поля B,C,D,E,... и в этих полях есть какой-то сложный график зависимостей, я бы хотел, чтобы он решался следующим образом:

  • Когда я устанавливаю значение A экспортировать данные формы (текущее состояние формы)
  • данные формы отправляются на сервер разведки
  • на сервере scout рассчитывается и разрешается график зависимостей (получаем список по порядку)
  • вызов setters полей в упорядоченном списке, которые "исправляют" данные формы
  • Импорт данных формы в конце.

Моя проблема в том, что если я вызову это событие в

 @Override
protected void execChangedValue() {
    // trigger export
    // trigger server validation
    // trigger import
}

я получил

2016-06-03 13:31:28,468 WARN  scout-model-thread-22 o.e.s.rt.client.ui.form.fields.AbstractValueField - Loop detection in ...$FieldA with value 101191 [m4042 @   ]
java.lang.Exception: null

Как это исправить?

У меня даже есть проблема, что, если я получаю сообщение об ошибке, я хочу прервать импорт и вернуть старое значение.

 @Override
protected void execChangedValue() {
    // trigger export
    // trigger server validation
    if (error) {
        setValueWithoutTrigger(oldValue)
    } else {
        // trigger import
    }
}

Что такое oldValue не имеет значения, это может быть нуль. (поэтому сбрасывайте значение при ошибке). Метод setValueWithoutTrigger такой же, как setValue(), но перед установленным значением вызывается this.setValueChangeTriggerEnabled(false);

Я знаю, что это как-то можно сделать, потому что я видел подобную функциональность в коде BSI.


person Marko Zadravec    schedule 03.06.2016    source источник
comment
Я не понимаю. Насколько я понимаю, вы хотите вычислить значения полей B, C, D и E на сервере. Зачем вам тогда нужно определять методы execChangedValue() на клиенте?   -  person Samuel Renold    schedule 09.06.2016
comment
Я не понимаю вашего комментария. Что тогда вызовет проверку на стороне сервера, если не execChangedValue()? Если я хочу инициировать проверку на сервере, когда пользователь изменяет некоторые данные в поле A, ее нужно запускать с клиента, и мне кажется, что execChangedValue подходит.   -  person Marko Zadravec    schedule 09.06.2016
comment
Ты прав. Теперь я понимаю ваш вопрос. Спасибо.   -  person Samuel Renold    schedule 09.06.2016


Ответы (1)


Невозможно установить значение поля в методе execChangedValue того же поля. Фреймворк обнаруживает здесь петлю.

Вместо этого вы можете использовать метод execValidateValue следующим образом.

@Override
protected String execValidateValue(String rawValue) throws ProcessingException {
    MyFormData formData = new MyFormData();
    exportFormData(formData);
    formData = sendFormDataToServerAndDoValidation();
    importBCDE(formData);
    return formData.getTest().getValue();
  }

Метод importBCDE установит поля B, C, D и E, но не поле A.

person Samuel Renold    schedule 09.06.2016
comment
Хорошо, но зачем обнаруживать петлю? (Я имею в виду, что вижу код и знаю почему, но...) На самом деле цикла нет. Поскольку импорт вызывается без триггера, execValidateValue больше не будет вызываться. Есть ли способ игнорировать обнаружение петли, потому что я знаю, что петли не будет? - person Marko Zadravec; 10.06.2016
comment
Существует метод под названием setValueChangeTriggerEnabled(boolean b). Однако это не работает, когда поле устанавливает собственное значение. - person Samuel Renold; 10.06.2016