我正在尝试构建一个名为CrudEntityField,的Tapestry组件,它基于TextField (核心)、DialogLink (topestry5-jQuery)和Dialog (topestry5-jQuery)组件,以及用于AJAX更新的Zone。
我的用例非常简单:
CrudEntityField将呈现为TextField。如果您知道实体id,您可以直接在那里输入。如果不知道id,可以单击
DialogLink按钮(SELECT),该按钮弹出一个对话框窗口。对话框以表格格式列出所有可用的实体,并允许我们根据某些标准进行筛选。一旦用户选择了实体,文本字段就会自动地用相关的id (例如'6')刷新。另外,为了清晰起见,还打印了相关的名称/描述(例如,‘'Gipuzkoa')快照:CrudEntityField,弹出对话框
理想情况下,所有这些逻辑都可以封装在一个Tapestry组件中。但接下来的问题是:
<div t:type="jquery/dialog" t:clientId="dialogIdXXX">,见下文)包括一个搜索表单,并且它本身嵌入到另一个表单(CRUD表单)中。由于不允许嵌套表单,我可以尝试取消嵌套。但是,这种方法将失败,因为在我有机会移动它之前,当内部表单呈现时,我会得到一个运行时异常。
@AfterRender公共afterRender(MarkupWriter编写器){ Element body = writer.getDocument().find("html/body");MarkupWriter}@HeartbeatDeferred、RenderCommand等,但是我没有找到将对话框呈现出表单的方法。组件模板:
<t:content>
<!-- A) Entity Field -->
<t:zone t:id="entityZone" id="zoneIdXXX">
<div class="inputElement">
<t:label for="textField"/>
<input t:id="textField"/>
[<t:body/>]
<t:jquery.dialoglink t:dialog="dialogIdXXX" class="dialogLink">SELECT</t:jquery.dialoglink>
</div>
</t:zone>
<!-- B) Entity Dialog -->
<div t:type="jquery/dialog" t:clientId="dialogIdXXX" params="params" >
<table t:id="xa2grid" t:entity="inherit:entity" t:add="actions">
<p:actionsCell>
<a t:type="EventLink" t:event="SELECT" t:zone="zoneIdXXX" t:context="entity.id" href="#">SELECT</a>
</p:actionsCell>
</table>
</div>
</t:content>EntityField (表单输入字段)和EntityDialog (放在表单之外,在页面模板中)。但是,这并不是最好的方法,因为这种方法打破了抽象。
但这种方法也行不通。区域事件现在由EntityDialog组件触发,必须由其自身或其一个容器来处理。但是这个区域是在EntityField中定义的,它现在是一个兄弟!(如果不清楚,我可以粘贴更多代码)。发布于 2013-06-18 10:10:03
正如您已经看到的,您不能在表单中呈现表单,因此需要将对话框的呈现推迟到表单呈现之后。
因此,不要在组件中呈现对话框,而是使用一个环境bean。环境将在页面上存储所有对话框的配置。
http://tapestry.apache.org/environmental-services.html
在每个页面的末尾包含一个块,它从环境中查找配置并呈现所有对话框。希望您使用的是布局,所以这将是在一个地方。
例: Layout.java
@Inject
Environment environment;
@Property
private DialogConfigs dialogConfigs;
@Property
private DialogConfig dialogConfig;
void beforeRender() {
dialogConfigs = new DialogConfigsImpl();
environment.push(DialogConfigs.class, dialogConfigs);
}
void afterRender() {
environment.pop(DialogConfigs.class);
}Layout.tml
<html>
<body>
<t:body/>
<t:loop source="dialogConfigs.values" value="dialogConfig">
<div t:type="jquery/dialog" foo="dialogConfig.foo" bar="dialogConfig.bar">
</t:loop>
</body>
</html>CrudEntityField.java
@Environmental
private DialogConfigs dialogConfigs;
@Parameter
private String foo;
@Parameter
private String bar;
void beforeRender() {
dialogConfigs.add(new DialogConfig(foo, bar));
}https://stackoverflow.com/questions/17104810
复制相似问题