gpt4 book ai didi

java - 为 facelets 组件自动生成的 ID

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:17:53 25 4
gpt4 key购买 nike

我们使用 facelets 来创建一些自定义的 Ajaxy 组件。我们想从默认组件中模仿的行为之一是 id 是可选的,如果没有传递,则会生成一个 id。我已经可以这样做了:

<ui:composition ...>
<div class="myComponent" id="#{jsfSupport.generateId(id)}">
...
</div>
</ui:composition>

我使用 JBoss el 调用支持方法(也可以使用 el 函数):

public class JsfSupport {

public String generateId(String id) {

if (id==null || "".equals(id){
return FacesContext.getCurrentInstance().getViewRoot().createUniqueId();
}
return id;
}

}

问题是,如果我在组件的 javascript 代码中的某处需要该 ID,我需要再次检索它。所以我想我可以做到以下几点:

<ui:composition ...>
<c:set var="id" value="#{jsfSupport.generateId(id)}" />
<div class="myComponent" id="#{id}">
...
</div>
<script type="text/javascript">
document.getElementById('#{id}');
</script>
</ui:composition>

但这行不通。 id 无论如何都会重新生成,我得到两个不同的。关于执行此操作的理想方法有什么想法吗?

最佳答案

<c:set>在 Facelets 中意味着别名,而不是像在 JSP 中那样的赋值。所以每次使用 #{id}被翻译成对 #{jsfSupport.generateId(id)} 的单独调用,这会导致您描述的问题。

您可以编写自己的 <c:set> 版本仅对传递的表达式求值一次并保存返回值的标记:

public class SetOnceHandler extends TagHandler
{
private TagAttribute var;
private TagAttribute value;

public SetOnceHandler(TagConfig cfg)
{
super(cfg);
value = getRequiredAttribute("value");
var = getRequiredAttribute("var");
}

public void apply(FaceletContext ctx, UIComponent parent)
{
ctx.setAttribute(var.getValue(ctx), value.getObject(ctx));
}
}

关于java - 为 facelets 组件自动生成的 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4602950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com