我目前处于需要使用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
的更新值。
答案 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
组件,我会很高兴听到。