在组合之外重用变量 - 在 jsf 中传递变量?
我正在使用 jsf 1.2,并且有一些奇怪的 javascript,这些 JavaScript 在我的项目中的几个地方重复出现。
我不想重复自己..但我发现没有办法做类似的事情:
<ui:composition>
<c:set var="confirmBlockJS" value="if (confirm('#{tk:encodeJS(confirmMessage)}')) {#{confirmed}} else{ #{notConfirmed}}"/>
</ui:composition>
现在我想使用 set 变量,但显然这会失败。
<ui:include src="/blocks/tech/confirmBlock.xhtml">
<ui:param name="confirmMessage" value="#{appTexts['action.logout.title']}"/>
<ui:param name="confirmed" value="return false;"/>
<ui:param name="notConfirmed" value=" #{doJS}"/>
</ui:include>
<h:outputLink id="logout" value="#" rendered="#{renderLogout}"
onclick='#{confirmBlockJS};'
styleClass="_allowEnterKey">
<h:outputText value="#{appTexts['action.logout']}"></h:outputText>
</h:outputLink>
那时,confirmBlockJS 显然是空的,这在我看来实际上是一件好事。但是有没有办法把变量向上传递呢?我尝试了 ui:param 但没有运气。
解决方案 当您想要在使用 ui:decorate
的页面外部访问通过 c:set
设置的变量时,请使用 ui:decorate
。它仍然是可见的。在 ui:include 的情况下,c:set 在外部不可见,但 ui:param 应该将其传递(例如,在 ui: 中使用 ui:param 而不是
组成)c:set
)包括
I'm using jsf 1.2 and have got some weird javascript which gets repeated at several places in my project.
I do not want to repeat myself.. but i found no way to do something similar to this:
<ui:composition>
<c:set var="confirmBlockJS" value="if (confirm('#{tk:encodeJS(confirmMessage)}')) {#{confirmed}} else{ #{notConfirmed}}"/>
</ui:composition>
Now i want to use the set variable but obv this will fail.
<ui:include src="/blocks/tech/confirmBlock.xhtml">
<ui:param name="confirmMessage" value="#{appTexts['action.logout.title']}"/>
<ui:param name="confirmed" value="return false;"/>
<ui:param name="notConfirmed" value=" #{doJS}"/>
</ui:include>
<h:outputLink id="logout" value="#" rendered="#{renderLogout}"
onclick='#{confirmBlockJS};'
styleClass="_allowEnterKey">
<h:outputText value="#{appTexts['action.logout']}"></h:outputText>
</h:outputLink>
confirmBlockJS is obviously empty at that point, which is actually in my eyes a good thing. But is there no way to pass the variable up? I tried ui:param without luck.
SOLUTION
Use ui:decorate
when you want to access variable set with c:set
outside of the page which uses the ui:decorate
. It will still be visible. In the case of ui:include the c:set will not be visible outside, but ui:param should pass it up (e.g. use ui:param instead of c:set
in the ui:include
composition)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
如果您不想将其内联为属性值,则
将是您的解决方案。EL 函数是最接近您可以满足此特定功能需求的函数:
或者:
请注意,通过 Java/JSF/EL 这种方式生成 JS 代码有点难闻。难道真的不可能让它成为一个简单的 JS 函数,将其放入
.js
文件中并使用参数对其进行参数化吗?If you didn't want to inline it as an attribute value, then
<ui:decorate>
would be the solution for you.An EL function is closest what you can get to work for this particular functional requirement:
or:
Note that generating JS code by Java/JSF/EL this way is a bit a smell. Is it really not possible to make it a simple JS function which you put in a
.js
file and parameterize it with arguments?