2014-01-16 4 views
1

Я пытаюсь создать редактор GWT для объекта компонента, который имеет два поля другого типа объекта, поэтому я хочу, чтобы субредакторы были для этих полей. Проблема в том, что я совершенно новичок в структуре редакторов, и я действительно не понимаю идею всех этих интерфейсов редактора там. Пожалуйста, сообщите о наилучшем решении. Мои идеи заключались в следующем: использование драйверов субредакторов для передачи данных в главный редактор; или использовать какой-то CompositeEditor (но я не знал, что делать с переопределенными методами ...). Вот пример кода:Как реализовать редактор GWT с субредакторами

public class A { 

    String s1, s2; 
    Integer i; 
    Double d; 
    B ba, bb; 

} 

public class B { 

    BigDecimal a, b; 
} 

//sub-editor 
public class BEditor extends Composite implements Editor<B> { 

    interface BDriver extends BeanEditorDriver<B, BEditor> { 
    } 

    //implements HasEditorErrors interface 
    ValueBoxEditorDecorator<BigDecimal> a, b; 
} 

//main editor 
public class AEditor extends Composite implements Editor<A> { 

    interface ADriver extends BeanEditorDriver<A, AEditor> { 
    } 

    private ADriver driver = GWT.create(ADriver.class); 

    ValueBoxEditorDecorator<String> s1, s2; 
    ValueBoxEditorDecorator<Integer> i; 
    ValueBoxEditorDecorator<Double> d; 
    BEditor ba, bb; 

    public AEditor() { 
     driver.initialize(this); 
     driver.edit(new A()); 
    } 

    //called when the editor form is submitted 
    public void onSubmit() { 

     driver.clearErrors(); 
     A a = driver.flush(); 
     // A has both B fields = null 
     // AEditor successfully displays validation errors, 
     // but BEditors do not display errors, nor does 
     // ADriver get any errors from BEditor 
    } 
} 

}

ответ

1

При создании VehiculeDTO, а также создавать B подклассы:

A a = new A(); 
a.setBa(new B()); 
a.setBb(new B()); 
driver.edit(a); 
+1

... и вам не нужен 'EditorDriver' в' BEditor'! –

+0

Хорошо, теперь я заполняю поля B, хотя они не получили подтверждения. Как я могу заставить ADriver собирать все ошибки проверки? – ahumellihuk

+0

Спасибо за ваш ответ! Я узнал, почему моя проверка не работает - мне не хватало аннотации @Valid для валидатора, чтобы пометить это поле как каскадный объект. – ahumellihuk

0

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

  • Определите ваш редактор верхнего уровня. В вашем случае это будет AEditor - в большинстве других случаев это будет мнение. Назначьте назначенный виджет интерфейсу редактора, с типом param = ваш фоновый объект (который вы сделали правильно).
  • Убедитесь, что ваш фоновый объект A включает в себя геттеры и сеттеры и поля являются закрытыми. Вы оставили их с доступом по умолчанию, который я не думаю, что это хорошая идея.
  • Убедитесь, что ваш виджет верхнего уровня содержит подредактор для каждого из полей в A. Они должны иметь то же имя, что и соответствующее поле в A, или аннотироваться с помощью @Path, чтобы указать, к какому полю они относятся ,
  • У ваших субредакторов никогда не должно быть собственного интерфейса драйвера. Они должны либо реализовать LeafValueEditor, ValueAwareEditor и т.д. или интерфейс адаптера, такие как IsEditor
  • В конструкторе для вашего верхнего редактора уровней (здесь, AEditor), вам необходимо инициализировать драйвер и подкладочный объект:
  • ADriver driver = GWT.create(ADriver.class); 
    public AEditor { 
        driver.initialize(this); 
        driver.edit(new A()); 
    } 
    

  • При сохранении вам необходимо вызвать driver.flush(), чтобы переместить данные из редактора верхнего уровня в фоновый объект. И наоборот, когда вы загружаете, вы должны вызвать driver.edit() с объектом подкачки, который хотите загрузить
  • Я выставил некоторые Gists, чтобы продемонстрировать LeafValueEditor и IsEditor, если вам нужна помощь в изменении вашего подредактора :

    LeafValueEditor

    IsEditor