3 Stimmen

Automatisch generierte IDs für Facelets-Komponenten

Wir verwenden Facelets, um einige benutzerdefinierte Ajaxy-Komponenten zu erstellen. Eines der Verhaltensweisen, die wir von den Standardkomponenten nachahmen möchten, ist, dass eine id optional ist und eine id generiert wird, wenn sie nicht übergeben wird. Ich kann das bereits so machen:

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

Ich verwende JBoss el, um eine Support-Methode aufzurufen (könnte auch el-Funktionen verwenden):

public class JsfSupport {

  public String generateId(String id) {

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

}

Das Problem ist, dass ich, wenn ich diese ID irgendwo in meinem Javascript-Code in der Komponente benötige, sie erneut abrufen muss. Also dachte ich, ich könnte das Folgende tun:

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

Aber das funktioniert nicht. Die ID wird trotzdem neu generiert und ich bekomme zwei verschiedene. Irgendwelche Ideen, was wäre der ideale Weg, dies zu tun?

1voto

socha23 Punkte 9991

<c:set> in Facelets bedeutet Aliasing, nicht eine Zuweisung wie in JSP. Daher ist jede Verwendung von #{id} wird in einen separaten Aufruf von #{jsfSupport.generateId(id)} was zu den von Ihnen beschriebenen Problemen führt.

Sie könnten Ihre eigene Version von <c:set> Tag, das den übergebenen Ausdruck nur einmal auswertet und den zurückgegebenen Wert speichert:

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));
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X