编辑器需要引用小部件才能实际使用它 - 在稍后显示表单之前推送值。您所要求的是让编辑器能够注意到shanonEditor
为空,并且以某种方式知道稍后再检查(何时?何时分配它?何时使表单可见?)尝试再次传递子值。这没有意义,也不是编辑器的工作方式。
相反,请考虑预先填充此字段 - 即不要让它变得懒惰。你现在通过让它变得懒惰获得了多少 - 你是在懒惰地推迟构建所有这些直到createAndBind
?您是否可以只允许积极地创建编辑器,并在 asWidget/createAndBind 之前关闭面板等?
假设是这样,假设您正在IsWidget
直接实现或扩展LazyPanel
,并且您几乎肯定会希望绘制这些子编辑器(只是还没有,即等待一两分钟,而不是永远不想要它们),继续并积极地创建叶值编辑器(字段等)和子编辑器(子面板),但在每一步中,推迟将这些组成部分实际组装到面板中,直到实际需要。这可能涉及@UiField(provided=true)
指示在createAndBind
需要调用之前填充这些字段:
public class CompanyEditor implements Editor<Company>, IsWidget {
interface Binder extends UiBinder<Widget, CompanyEditor> {}
private static final Binder binder = GWT.create(Binder.class);
@UiField(provided = true)
TextBox name = new TextBox();
@UiField(provided = true)
PersonEditor owner = new PersonEditor();
private Widget root;
@Override
public Widget asWidget() {
if (root == null) {
root = binder.createAndBind(this);
}
return root;
}
}
public class PersonEditor implements Editor<Person>, IsWidget {
interface Binder extends UiBinder<Widget, CompanyEditor> {}
private static final Binder binder = GWT.create(Binder.class);
@UiField(provided = true)
TextBox firstName = new TextBox();
@UiField(provided = true)
TextBox lastName = new TextBox();
@UiField(provided = true)
@Path("address.city")
TextBox city = new TextBox();
private Widget root;
@Override
public Widget asWidget() {
if (root == null) {
root = binder.createAndBind(this);
}
return root;
}
}