почему мы должны установить bean ** binder.setBean (object) ** в привязке в vaadin - PullRequest
1 голос
/ 09 января 2020

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

consumerBinder.forField(legal_hold)
    .bind(Consumer::getLegal_hold, Consumer::setLegal_hold);

consumerBinder.forField(deceased_fg)
    .bind(Consumer::getDeceased_fg, Consumer::setDeceased_fg);

consumerBinder.forField(household_id)
    .withConverter(new StringToLongConverter("Must be a number"))
    .bind(Consumer::getHousehold_id,Consumer::setHousehold_id);

consumerBinder.forField(ins_efid)
    .withConverter(new StringToLongConverter("Must be a number"))
    .bind(Consumer::getIns_efid,Consumer::setIns_efid);

consumerBinder.forField(ins_pqid)
    .withConverter(new StringToLongConverter("Must be a number"))
    .bind(Consumer::getIns_pqid,Consumer::setIns_pqid);

consumerBinder.forField(ins_rid)
    .withConverter(new StringToLongConverter("Must be a number"))
    .bind(Consumer::getIns_rid,Consumer::setIns_rid);

consumerBinder.forField(upd_efid)
    .withConverter(new StringToLongConverter("Must be a number"))
    .bind(Consumer::getUpd_efid,Consumer::setUpd_efid);

consumerBinder.forField(upd_pqid)
    .withConverter(new StringToLongConverter("Must be a number"))
    .bind(Consumer::getUpd_pqid,Consumer::setUpd_pqid);

consumerBinder.forField(upd_rid)
    .withConverter(new StringToLongConverter("Must be a number"))
    .bind(Consumer::getUpd_rid,Consumer::setUpd_rid);

consumerBinder.forField(upd_tmstmp)
    .withConverter(new StringTimestampConvertor())
    .bind(Consumer::getUpd_tmstmp, Consumer::setUpd_tmstmp);

consumerBinder.forField(ins_tmstmp)
    .withConverter(new StringTimestampConvertor())
    .bind(Consumer::getIns_tmstmp, Consumer::setIns_tmstmp);

consumerBinder.forField(deceased_dt)
    .withConverter(new StringTimestampConvertor())
    .bind(Consumer::getDeceased_dt, Consumer::setDeceased_dt);

binder.setBean(new Consumer());

Из-за этого я получаю значение по умолчанию 0 для длинных полей. Но я хочу, чтобы форма была понятной.

1 Ответ

3 голосов
/ 09 января 2020

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

Если вы хотите, чтобы всегда показывал 0 как пустое в тексте полей, то вы можете создать пользовательский подкласс StringToLongConverter, который преобразует 0 в "" и в противном случае делегирует исходную реализацию.

Если вы хотите, чтобы 0 отображался как пустой только при вводе новых данных но покажите 0 как 0 при редактировании существующего элемента, тогда вы можете пропустить setBean при инициализации связывателя и вместо этого создавать и заполнять экземпляр компонента только при сохранении, например, что-то вроде этого:

saveButton.addClickListener(event -> {
  Consumer newConsumer = new Consumer();
  binder.writeBean(newConsumer);
  saveInDatabase(newConsumer);
});

Вы можете прочитать документацию по https://vaadin.com/docs/v14/flow/binding-data/tutorial-flow-components-binder-load.html для получения дополнительной информации о разнице между setBean и writeBean.

...