GWT-редакторы и субредакторы

Я пытаюсь запустить пример редакторов с подредакторами. При очистке родительского элемента значение дочернего редактора равно нулю. Классы Персона и Адрес. Главный редактор:

    // editor fields
public TextField firstname;
public TextField lastname;
public NumberField<Integer> id;

public AddressEditor address = new AddressEditor();

public PersonEditor(Person p){
    asWidget();
}

@Override
public Widget asWidget() {
    setWidth(400);
    setBodyStyle("padding: 5px;");
    setHeaderVisible(false);

    VerticalLayoutContainer c = new VerticalLayoutContainer();

    id = new NumberField<Integer>(new IntegerPropertyEditor());
    // id.setName("id");
    id.setFormat(NumberFormat.getFormat("0.00"));
    id.setAllowNegative(false);
    c.add(new FieldLabel(id, "id"), new VerticalLayoutData(1, -1));

    firstname = new TextField();
    // firstname.setName("firstname");
    c.add(new FieldLabel(firstname, "firstname"), new VerticalLayoutData(1, -1));

    lastname = new TextField();
    lastname.setName("lastname");
    c.add(new FieldLabel(lastname, "lastname"), new VerticalLayoutData(1, -1));

    c.add(address);
    add(c);
    return this;

Подредактор:

public class AddressEditor extends Composite implements Editor<Address> {

private AddressProperties props = GWT.create(AddressProperties.class);
private ListStore<Address> store = new ListStore<Address>(props.key());
ComboBox<Address> address;

public AddressEditor() {
    for(int i = 0; i < 5; i ++)
        store.add(new Address("city" + i));
    address = new ComboBox<Address>(store, props.nameLabel());

    address.setAllowBlank(false);
    address.setForceSelection(true);
    address.setTriggerAction(TriggerAction.ALL);
    initWidget(address);
}

И вот где драйвер создан:

private HorizontalPanel hp;

private Person googleContact;
PersonDriver driver = GWT.create(PersonDriver.class);

public void onModuleLoad() {

    hp = new HorizontalPanel();
    hp.setSpacing(10);

    googleContact = new Person();
    PersonEditor pe = new PersonEditor(googleContact);

    driver.initialize(pe);
    driver.edit(googleContact);

    TextButton save = new TextButton("Save");
    save.addSelectHandler(new SelectHandler() {

        @Override
        public void onSelect(SelectEvent event) {
            googleContact = driver.flush();
            System.out.println(googleContact.getFirstname() + ", " + googleContact.getAddress().getCity());
            if (driver.hasErrors()) {
                new MessageBox("Please correct the errors before saving.").show();
                return;
            }
        }
    });

Значение googleContact.getFirstname() заполнено, но googleContact.getAddress() всегда равно нулю. Что мне не хватает?

1 ответ

Решение

AddressEditor необходимо сопоставить с Address модель - в настоящее время, кажется, если Address только один получатель / установщик, называемый getAddress() а также setAddress(Address)что не имеет большого смысла.

Если вы хотите просто ComboBox<Address> (который реализует Editor<Address> уже), рассмотрите возможность размещения этого комбо в PersonEditor непосредственно. В противном случае вам нужно будет добавить @Path("") к AddressEditor.address поле, чтобы указать, что оно должно непосредственно редактировать само значение, а не подчиненное свойство (т.е. person.getAddress().getAddress()).

Другим способом создания редактора адресов было бы перечисление каждого из свойств Address введите в AddressEditor, Это то, что драйвер ожидает по умолчанию, поэтому он сбит с толку, когда видит поле под названием "адрес".

Две быстрые мысли о самом коде: нет необходимости передавать человека в PersonEditor - это работа самого водителя. Во-вторых, поля вашего редактора не должны быть publicони просто не могут быть private,

Другие вопросы по тегам