在组合之外重用变量 - 在 jsf 中传递变量?

发布于 2024-12-04 07:57:21 字数 1368 浏览 1 评论 0原文

我正在使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

煞人兵器 2024-12-11 07:57:21

如果您不想将其内联为属性值,则 将是您的解决方案。

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>

请注意,通过 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:

<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>

or:

<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>

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?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文