带有内部 uiBinder 代码的小部件

Widget with internal uiBinder code

我想创建小部件,您可以在其中注入部分 uiBinder 代码。 例如

<c:MyWidget title="Title text" type="SOME_TYPE">
    <g:Button ... />
    <g:HTMLPanel ... > ... </g:HTMLPanel>   
</c:MyWidget>

我添加了 MyWidget 本身的 uiBinder 代码如下:

<g:HTMLPanel>
    <g:HTMLPanel styleName="...">SOME HEADER</g:HTMLPanel>
    <g:HTMLPanel ui:field="mainBody"/>
    <g:HTMLPanel styleName="...">SOME FOOTER</g:HTMLPanel>
</g:HTMLPanel>

并进入主体我想注入通过包装的代码

到目前为止我所做的是:

public class MyWidget extends Composite implements HasSafeHtml {
...
    private static MyWidgetUiBinder uiBinder = GWT.create(MyWidgetUiBinder.class);
    interface MyWidgetUiBinder extends UiBinder<Widget, MyWidget> {}

...

@Override
public void setHTML(String html) {
    modalBody.getElement().setInnerHTML(html);
    this.innerContent = html;
}

但它不会解析生成的代码,例如按钮或 html 面板我只能插入纯 html.

我也像上面那样做了某事

public class MyWidget extends HTMLPanel {
private static MyWidgetUiBinder uiBinder = GWT.create(MyWidgetUiBinder.class);
interface MyWidgetUiBinder extends UiBinder<Widget, MyWidget> {}

@UiConstructor
public ModalWindow(Type type, String title, String html) {
    super(html);
...

但我什至不知道如何从这个问题的第一个代码列表中捕获代码形式。我遇到错误 "missing required attribute(s): html:"

有人知道如何构建这样的组件吗?

你只需要实现HasWidgets接口。在 add() 方法中将小部件插入 mainBody 面板。

public class MyWidget extends Composite implements HasWidgets {

    private static MyWidgetUiBinder uiBinder = GWT.create(MyWidgetUiBinder.class);

    interface MyWidgetUiBinder extends UiBinder<Widget, MyWidget> {}

    @UiField
    HTMLPanel mainBody;

    public MyWidget() {
        initWidget(uiBinder.createAndBindUi(this));
    }

    @Override
    public void add(Widget w) {
        mainBody.add(w);
    }

    @Override
    public void clear() {
        mainBody.clear();
    }

    @Override
    public Iterator<Widget> iterator() {
        return mainBody.iterator();
    }

    @Override
    public boolean remove(Widget w) {
        return mainBody.remove(w);
    }
}

已测试,有效。