通过MarkupWriter进行组件绑定 - Tapestry

时间:2016-07-25 14:55:37

标签: java data-binding tapestry

我目前处于需要使用MarkupWriter创建复选框而非使用.tml的情况。但这是在一个组件内,我想将复选框的值绑定到父的布尔值。实质上,它是以下内容:

组件

public class InnerComponent {
    @Parameter
    private boolean booleanValue;

    void afterRender(final MarkupWriter writer) {
        writer.element("input", "type", "checkbox");
        writer.end();
    }
}

致电页面

public class OuterPage {
    @Property
    private boolean checkboxValue;

    @InjectComponent
    private Zone booleanZone;

    Object onDisplayBoolean() {
        return booleanZone.getBody();
    }
}

使用.tml

<html t:type="layout" title="testProject Index" xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd">
    <t:InnerComponent booleanValue='checkboxValue'/><br/>

    <t:eventlink event='displayBoolean' zone='booleanZone'>Update</t:eventlink>

    <t:zone t:id='booleanZone' id='booleanZone'>
        ${checkboxValue}
    </t:zone>
</html>

组件MarkupWriter目前只写出一个简单的复选框。但它也接收布尔值作为参数。我如何将布尔参数绑定到MarkupWriter生成的复选框?

在这个简单的示例中,选中复选框,然后通过Zone更新EventLink,应该会显示父checkboxValue boolean的更新值。

1 个答案:

答案 0 :(得分:0)

通过Tapestry的源代码筛选,我找到了 a 解决方案。我的组件首先应该扩展AbstractField,然后处理控件的提交。使用更新的值重新分配值。编辑,它看​​起来如下:

public class InnerComponent extends AbstractField {
    @Property
    @Parameter
    private boolean booleanValue;

    @BeginRender
    void begin(final MarkupWriter writer) {
        writer.element("input", "type", "checkbox",
                "name", getControlName(),
                "id", getClientId(),
                "checked", booleanValue ? "checked" : null);
        writer.end();
    }

    @Override
    protected void processSubmission(String controlName) {
        String postedValue = request.getParameter(controlName);
        booleanValue = postedValue != null;
    }
}

这样我实际上是在重新实现复选框逻辑。与.tml不同,我可以使用现有的Tapestry Checkbox组件。如果有更好的解决方案,比如使用现有的Checkbox组件,我会很高兴听到。