如何在EL中使用生成的id(jsf,composite)?

时间:2015-12-23 14:00:08

标签: jsf-2 el composite-component

我想要一个组成

的复合材料
<h:form id="f_imgA" >
        <h:graphicImage id="imgA"
            onclick="document.getElementById('#{k_imgA.clientId}').value=mods(event)"
            value="images/img?r=#{Math.random()}">
            <f:ajax event="click" listener="#{mBean.handleEvent}"
                execute="@this k_imgA" render="@this"></f:ajax>
        </h:graphicImage>
        <h:inputHidden id="k_imgA" binding="#{k_imgA}" value="#{mBean.keyX}" />
</h:form>

当我写

<comps:cimg imgId="imgA" />

此代码的最初目的是将修饰符状态(Ctrl,Shift,Alt)发送到服务器。

我有

<composite:interface>
    <composite:attribute name="imgId" />
</composite:interface>

<composite:implementation>
    <h:form id="f_#{cc.attrs.imgId}">
        <h:graphicImage id="#{cc.attrs.imgId}"
            onclick="document.getElementById('#{k_${cc.attrs.imgId}.clientId}').value=mods(event)"
            value="images/img?r=#{Math.random()}">
            <f:ajax event="click" execute="@this k_#{cc.attrs.imgId}"
                listener="#{mBean.handleEvent}" render="@this">
            </f:ajax>
        </h:graphicImage>
        <h:inputHidden id="k_#{cc.attrs.imgId}"
            binding="k_#{cc.attrs.imgId}" value="#{mBean.keyX}" />
    </h:form>
</composite:implementation>

,这完全是预期的,不起作用。违规表达是

#{k_${cc.attrs.imgId}.clientId}

用于返回id为k_imgA的hiddenInput的clientId。据我所知,EL不能像上面那样处理嵌套表达式,但值得一试。那么有一个简单,直接的方法来获取k_imgA的clientId吗?如果可以避免,我不想使用更多的javascript。

编辑: 不要对#{Math.random()}感到困惑,它的作用只是因为我有一个名为“Math”的bean。

javascript函数mods由

给出
<h:outputScript target="body">function mods(event) {return  ((event.ctrlKey)?1:0)+((event.shiftKey)?2:0)+((event.altKey)?4:0)} </h:outputScript>

1 个答案:

答案 0 :(得分:0)

你不需要摆弄所有_#{cc.attrs.imgId}。只需给复合材料一个固定的id。他们已经在命名容器了。然后JSF会担心其余部分。

<composite:implementation>
    <h:form id="f">
        <h:graphicImage id="i" ... />
        <h:inputHidden id="k" ... />
    </h:form>
</composite:implementation>

用法:

<comps:cimg id="imgA" />

生成的HTML:

<form id="imgA:f" ...>
    <img id="imgA:f:i" ... />
    <input id="imgA:f:k" ... />
</form>

关于JS的尝试,你最好使用元素自己的ID作为基础:

<h:graphicImage onclick="document.getElementById(id.substring(0,id.lastIndexOf(':')+1)+'k').value='...'" />

或者,更简单的是,如果隐藏元素保证是生成的HTML DOM树中图像元素的直接兄弟,那么只需抓住它Node#nextSibling

<h:graphicImage onclick="nextSibling.value='...'" />
<h:inputHidden ... />

binding将永远不会像您尝试过的构造一样工作,即使这样,您最好通过请求范围中的Map或所谓的后备组件来执行此操作。

另见: