我正在使用jsf 1.2并且有一些奇怪的javascript会在我项目的几个地方重复出现。
我不想重复自己..但我发现没办法做类似的事情:
<ui:composition>
<c:set var="confirmBlockJS" value="if (confirm('#{tk:encodeJS(confirmMessage)}')) {#{confirmed}} else{ #{notConfirmed}}"/>
</ui:composition>
现在我想使用set变量,但obv会失败。
<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应该将它传递出去(例如在c:set
组合中使用ui:param而不是ui:include
)
答案 0 :(得分:2)
如果您不想将其内联为属性值,那么<ui:decorate>
将是您的解决方案。
EL功能最接近您可以为此特定功能要求工作:
<h:outputLink id="logout" value="#" rendered="#{renderLogout}"
onclick="#{js:confirmBlock(appTexts['action.logout.title'], 'return false;', doJS)}"
styleClass="_allowEnterKey">
<h:outputText value="#{appTexts['action.logout']}"></h:outputText>
</h:outputLink>
或:
<ui:param name="confirmBlock" value="#{js:confirmBlock(appTexts['action.logout.title'], 'return false;', doJS)}" />
<h:outputLink id="logout" value="#" rendered="#{renderLogout}"
onclick="#{confirmBlock}"
styleClass="_allowEnterKey">
<h:outputText value="#{appTexts['action.logout']}"></h:outputText>
</h:outputLink>
请注意,通过这种方式生成JS / JSF / EL的JS代码有点气味。是不是真的不能把它变成一个简单的JS函数,你放在一个.js
文件中并用参数对它进行参数化?