带有内部uiBinder代码的小部件

时间:2017-02-06 17:27:35

标签: gwt uibinder

我想创建小部件,你可以注入一些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;
}

但它没有解析生成的代码,如按钮或htmlPanels,我只能插入纯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);
...

但我甚至不知道如何从这个问题的第一个代码列表中捕获代码表单。我收到错误&#34;缺少必需的属性:html:&#34;

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

1 个答案:

答案 0 :(得分:2)

您只需要实现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);
    }
}

经测试,它有效。