2016-07-25 77 views
0

我目前处于这种情况,我需要使用MarkupWriter创建复选框而不是使用.tml。但是,这是在一个组件内,我想将复选框的值绑定到父节点的布尔值。从本质上讲,它是以下几点:通过MarkupWriter绑定组件 - 挂毯

组件

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生成?

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

回答

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,我可以使用现有的TapestryCheckbox组件。如果有更好的解决方案,比如使用现有的Checkbox组件,我很高兴听到。