web-dev-qa-db-ger.com

Bedingtes Rendern eines <ui: include>

Ich versuche, eine Seite umzuschalten, die einen <rich:dataTable> anzeigt. Vorher habe ich nur die <ui:include>-Vorlage eingefügt und sie würde die ganze Zeit nur die Tabelle anzeigen.

<ui:include src="../log/viewDlg.xhtml"/>

Jetzt möchte ich es auf der Webseite ein- und ausschalten können. Wird auf der Seite mit einem Button oder Link angezeigt. Wie kann ich das erreichen?


Update 1: Ich bin nicht in der Lage, es aus irgendeinem Grund aufzurufen. Hier ist, was ich bisher geschrieben habe, basierend auf Feedback

Aussicht:

<a4j:commandLink value="View"
    action="#{bean.showview}" render="viewPanel"/>

<h:panelGroup id="viewPanel">
    <h:panelGroup id="tableRenderPanel" rendered="#{bean.showPolicyView}">    
        <ui:include src="../log/viewDlg.xhtml"/>
    </h:panelGroup>                         
</h:panelGroup>

Stützbohne:

private boolean showPolicyView = false;

public void showView() {
    showPolicyView = !showPolicyView;
}

public boolean isShowPolicyView(){
    return showPolicyView;
}
12
Gilbert V

Wickeln Sie Ihren <ui:include> in zwei <h:panelGroup>-Elemente ein. Hier gibt es einen Haken, Sie können eine bedingte Komponente nicht erneut lesen. Warum ist das so? Wenn das rendered-Attribut des Elements in false aufgelöst wird, wird es beim Rendern der Ansicht nicht berücksichtigt, sodass es nicht das Ziel einer Operation sein kann (in diesem Fall im Zusammenhang mit der Renderisierung).

Wenn Sie zum Code springen, haben Sie Folgendes:

<h:panelGroup id="wrapperPanel">
    <h:panelGroup id="tableRenderPanel" rendered="#{yourBean.renderTable}">
        <ui:include src="../log/viewDlg.xhtml"/>
    </h:panelGroup>
</h:panelGroup>

yourBean#renderTable ist eine Boolean-Eigenschaft, die bestimmt, ob die Komponente gerendert wird. Wenn es zu false ausgewertet wird, ist die Komponente nicht in der Komponentenstruktur enthalten.


Ansicht umschalten

Um die Ansicht umzuschalten, erstellen Sie einfach eine Bean-Methode, die die Seite entweder aktualisiert

<h:commandLink action="#{yourBean.toggleTableView}"/>

oder das jeweilige Panel über AJAX. Verwenden Sie dazu in JSF 1.2 Erweiterungen wie RichFaces, um AJAX einzuführen, wenn Sie können. Wenn Sie beispielsweise RichFaces wählen, können Sie <a4j:commandLink/> und das praktische Attribut render (oder reRender in älteren Versionen) verwenden, um zu erreichen, was Sie normalerweise mit einem <f:ajax/> in JSF 2 tun könnten

<a4j:commandLink action="#{yourBean.toggleTableView}" reRender="wrapperPannel"/>

Oder eine andere Alternative ist

<a4j:commandLink action="#{yourBean.toggleTableView}">
    <a4j:support event="oncomplete" reRender="wrapperPannel"/>
</a4j:commandLink>

Bitte beachten Sie, dass das reRender-Attribut abhängig von der Struktur Ihrer Seite variieren kann, es sollte jedoch am Ende immer die ID des Umbruchfensters referenzieren. In späteren RichFaces-Versionen wurde reRender in render umbenannt.

Vorausgesetzt, Sie haben eine renderTable-Eigenschaft (getter + setter) in yourBean, muss die toggleTableView diese ändern, um zu definieren, ob die Komponente gerendert werden soll oder nicht (renderTable = false).


Einführung in RichFaces

Überprüfen Sie diesen Link , um Hilfe beim Einrichten von RichFaces in Ihrem Projekt zu erhalten. 

20
Fritz

Ich mag die Verwendung von Tag-Handlern besser als das Einfügen von h:panelBoxes wie hier: 

<c:choose> <c:when test="#{myBean.yourCondition()}"> <ui:include src="viewA.xhtml"/> </c:when> <c:otherwise> <ui:include src="viewB.xhtml"/> </c:otherwise> </c:choose>

Vorteil: Tag-Handler stellen keine Komponenten dar und werden nie Teil des Komponentenbaums, sobald die Ansicht erstellt wurde. Ihr CSS wird dadurch nicht beeinträchtigt - der h:panelBox fügt dagegen ein div oder span ein.

Achten Sie beim Fummeln mit Tag-Handlern (wie bei jedem beliebigen c:xxx) auf den Unterschied zwischen UI-Komponenten und Tag-Handlern . Benutzeroberflächenkomponenten und Tag-Handler werden nämlich in verschiedenen Phasen gerendert. Dies bedeutet, dass Sie keine Variable in einer Verbundkomponente erstellen und in einem verschachtelten Tag-Handler verwenden können. c:choose und ui:include sind beide Tag-Handler. Normalerweise ist das kein Problem. Lesen Sie den Link, es ist ein sehr kurzes Beispiel und sehr aufschlussreich.