我有一个数据表,它循环遍历一个List并有一个值列,其呈现如下:
<h:dataTable var="assessmentFieldValue" value="#{assessmentBean.assessmentFieldValues}">
...
<ui:fragment rendered="#{assessmentFieldValue.field.type eq 'TEXT'}">
<h:inputText value="#{assessmentFieldValue.value}" />
</ui:fragment>
<ui:fragment rendered="#{assessmentFieldValue.field.type eq 'SLIDER'}">
<component:slider value="#{assessmentFieldValue.value}" />
</ui:fragment>
...
</h:dataTable>
所以有时我会得到一个标准的inputText,有时我会得到我的复合滑块组件:
<composite:interface>
<composite:attribute name="value" />
</composite:interface>
<composite:implementation>
<script type="text/ecmascript">
function updateValue(value) {
$('##{cc.id} span').each(function() {
$(this).text(value);
});
}
</script>
<div id="#{cc.id}">
<input id="sliderComponent" type="range" min="1" max="10"
value="#{cc.attrs.value}"
style="float: left"
onchange="javascript:updateValue(this.value);" />
<h:outputText id="fieldValue" value="#{cc.attrs.value}"
style="min-width: 20px; display: block; float: left" />
</div>
</composite:implementation>
这一切都按照我的意愿呈现(在JBoss-AS7上部署),但是当我点击与数据表关联的保存按钮时,assessmentBean.assessmentFieldValue List没有反映滑块组件上的任何值更改但它< em> 用于标准inputText。
任何人都可以建议为什么滑块的更改不会回到支持bean?谢谢!
答案 0 :(得分:3)
那是因为您使用了纯HTML <input>
元素而不是像<h:inputText>
这样的完整JSF输入组件。这样,该值绝不会绑定到JSF上下文。它仅被视为普通的vanilla模板输出值,而不是输入值。复合组件不会解决这个问题。您真的需要为此创建一个值得信赖的UIComponent
(或者寻找已经为您完成了令人讨厌的工作的第三方组件库,例如PrimeFaces及其{{3} })。