2016-07-25 3 views
0

Ich bin derzeit in einer Situation, in der ich die MarkupWriter verwenden muss, um ein Kontrollkästchen anstelle von .tml zu erstellen. Aber das ist in einer Komponente und ich möchte den Wert des Kontrollkästchens an den booleschen Wert des Elternelements binden. Im Wesentlichen ist es folgende:Bindung von Komponenten durch MarkupWriter - Tapestry

Komponente

public class InnerComponent { 
    @Parameter 
    private boolean booleanValue; 

    void afterRender(final MarkupWriter writer) { 
     writer.element("input", "type", "checkbox"); 
     writer.end(); 
    } 
} 

Berufung Seite

public class OuterPage { 
    @Property 
    private boolean checkboxValue; 

    @InjectComponent 
    private Zone booleanZone; 

    Object onDisplayBoolean() { 
     return booleanZone.getBody(); 
    } 
} 

Mit .tml

<html t:type="layout" title="testProject Index" xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd"> 
    <t:InnerComponent booleanValue='checkboxValue'/><br/> 

    <t:eventlink event='displayBoolean' zone='booleanZone'>Update</t:eventlink> 

    <t:zone t:id='booleanZone' id='booleanZone'> 
     ${checkboxValue} 
    </t:zone> 
</html> 

Die Komponente MarkupWriter schreibt gerade ein einfaches Kontrollkästchen aus. Es erhält aber auch den booleschen Wert als Parameter. Wie würde ich den booleschen Parameter an die Checkbox MarkupWriter binden?

In diesem einfachen Beispiel sollte die Überprüfung des Kontrollkästchens und dann die Aktualisierung der Zone durch die EventLink den aktualisierten Wert der checkboxValue boolean des übergeordneten Elements anzeigen.

Antwort

0

Sichten durch Tapestry 's Quellcode, ich habe eine Lösung gefunden. Meine Komponente sollte zuerst AbstractField erweitern und dann die Einreichung der Kontrolle verarbeiten. Den Wert mit dem aktualisierten Wert neu zuweisen. Bearbeitet, sieht es wie folgt aus:

public class InnerComponent extends AbstractField { 
    @Property 
    @Parameter 
    private boolean booleanValue; 

    @BeginRender 
    void begin(final MarkupWriter writer) { 
     writer.element("input", "type", "checkbox", 
       "name", getControlName(), 
       "id", getClientId(), 
       "checked", booleanValue ? "checked" : null); 
     writer.end(); 
    } 

    @Override 
    protected void processSubmission(String controlName) { 
     String postedValue = request.getParameter(controlName); 
     booleanValue = postedValue != null; 
    } 
} 

Auf diese Weise bin ich tatsächlich Re-Implementieren der Checkbox-Logik. Anders als in .tml, wo ich die vorhandene TapestryCheckbox Komponente verwenden könnte. Wenn es eine bessere Lösung gibt, wie die Verwendung der vorhandenen Checkbox Komponente, würde ich mich freuen zu hören.

Verwandte Themen