这合法吗?
<h:form id="status${a.myID}" >
// ...
</h:form>
其中'a'是辅助bean中的对象。它似乎有点工作,但是当我查看呈现的HTML时,我会将ID视为::0:status
,而不是我期望的:status0
。我的主要问题是尝试引用<f:ajax render=...
中的id。我得到了“包含一个未知的身份......”,几乎我能想到的每一个组合。是否可以可靠地使用来自辅助bean的值设置ID?
答案 0 :(得分:5)
单字母变量名${a}
以及在客户端ID中自动附加的迭代索引(如:0
的症状)表明此<h:form>
位于JSF迭代组件中以<h:dataTable>
或<ui:repeat>
为var="a"
实际 <支持bean。它将确认并解释到目前为止所描述的所有症状。如果${a}
是一个真正的支持bean(而不是迭代变量),那么它就会“工作”,你会看到:0:status0
,:1:status0
,:2:status0
等 - 虽然它的用处有问题。
首先,在视图构建时,即基于XHTML源代码文件构建JSF组件树的时刻,评估和设置JSF组件的id
属性。 JSF迭代组件的var
属性是在视图呈现时间期间设置的,即基于JSF组件树生成HTML输出的时刻。因此,逻辑结果是,var
属性设置的对象在需要设置id
属性时不可用,因此计算为null / empty-string。效果与你做的时候完全相同
<h:form id="status">
JSF迭代组件已经自动将迭代索引附加到生成的客户端ID。在组件ID中手动设置迭代项的ID没有任何意义。在JSF组件树中只有物理上只有一个 <h:form>
组件,而在基于当前迭代轮次生成HTML输出期间,该组件又被重复使用多次。
这个Q&amp; A也应该提供更多的思考:JSTL in JSF2 Facelets... makes sense?
回到您在<f:ajax render>
中引用组件的具体功能要求,您肯定需要以不同方式解决此问题。遗憾的是,您没有清楚地描述源组件和目标组件的上下文,因此无法提供/解释正确的客户端ID,因此我只是给您一个链接,以便您可以自己解决: How to find out client ID of component for ajax update/render? Cannot find component with expression "foo" referenced from "bar"
无关,旧的JSP EL样式${...}
在Facelets 完全中具有与#{...}
相同的效果。为了避免您和您未来的维护者混淆,建议完全禁止${...}
使用并始终坚持#{...}
。另请参阅Difference between JSP EL, JSF EL and Unified EL
答案 1 :(得分:0)
实际上${a.myID}
这不会呈现任何输出。当您获得:0:status
作为表单ID时,:0
是HTML树结构中:status
的父级。