JSF a4j: command funktioniert nicht, wenn ‚behindert‘ Set ist
Frage
Wenn ich ein ‚behindert‘ Attribut auf einem a4j umfassen: Befehlsschaltfläche, die Klage der Taste wird nicht ausgeführt. Unter dem ‚behindert‘ Attribute out Ursachen es richtig zu arbeiten. Ich bin keine spezielle Validierung zu tun (das ich kenne) und zu sehen, bin keine Validierung Fehlermeldungen.
Hier ist ein Teil meiner Seite:
<t:dataTable id="myTable"
var="region"
value="#{MyPageBackingBean.regions}"
width="100%">
...
<a4j:commandButton value="Update"
action="#{region.doUpdate}"
oncomplete="alert('done');"
disabled="#{!empty region && region.messageEmpty}"
immediate="true"/>
...
</t:dataTable>
Irgendwelche Ideen? Dank!
Edit:
Ich habe versucht preserveDataModel = "true" auf dem T einstellen. Datatable ohne Erfolg
Ich habe auch einen Test ein a4j mit: Befehlsschaltfläche und Textfeld ohne Datentabelle, aber die Backing Bean Aktion wird noch nicht gefeuert:
<h:form>
<a4j:region>
<a4j:outputPanel id="testregion">
<h:messages id="messages"/>
<a4j:status>
<f:facet name="start">
<h:graphicImage value="/images/progress_indicator.gif"/>
</f:facet>
</a4j:status>
<h:inputTextarea
rows="5"
value="#{MyPageBackingBean.myValue}"
style="width:100%; border: 1px solid #99CCFF;">
<a4j:support event="onkeyup"
reRender="testregion"
eventsQueue="messageModificationQueue"
ignoreDupResponses="true"
requestDelay="500"/>
</h:inputTextarea>
<a4j:commandButton id="doDelete"
value="Delete"
action="#{MyPageBackingBean.dummy}"
reRender="testregion"
disabled="#{empty MyPageBackingBean.myValue}"/>
<h:outputText value="#{MyPageBackingBean.myValue}"/>
</a4j:outputPanel>
</a4j:region>
</h:form>
Hier ist der neue Backing Bean Code zum Testen verwendet:
private String m_myValue = null;
public String getMyValue()
{
return m_myValue;
}
public void setMyValue(String value)
{
m_myValue = value;
}
private String mystr2 = null;
public String dummy()
{
mystr2 = "hello";
return null;
}
Danke!
Lösung
In HTML Welt, das disabled
Attribut bewirkt, dass das name
-value
Attributpaar eines HTML-Eingabeelementes (input
, select
, textarea
und button
) nicht auf die Server-Seite gesendet werden.
In JSF Welt, die presense des name
Attributs wird verwendet, um die Bohne Maßnahmen zu identifizieren, die auf der Server-Seite aufgerufen werden. Doch während der Anforderungswert Phase der Form gilt einreichen auch JSF überprüft, ob die Komponente disabled
(und rendered
) attribtue auswertet true
bevor Sie irgendwelche Maßnahmen ergreifen.
Die #{region}
ist hier eine iterative Tabellenzeile Objekt von #{MyPageBackingBean.regions}
deren isMessageEmpty()
Getter durch Standard kehrt true
. In dem neuen Antrag der Form legt die #{MyPageBackingBean.regions}
scheinbar leer ist, die dort wirksam auf die Schaltfläche disabled
macht. JSF wird nicht rufen Sie die zugehörige Aktion dann.
Auf den Punkt gebracht, müssen Sie sicherstellen, dass #{MyPageBackingBean.regions}
kehrt genau in der nachfolgenden Anforderung das gleiche Datenmodell machen. Einfachste Lösung ist es, die MyPageBackingBean
Bohne in Sitzungsbereich zu platzieren, so dass es in der anschließenden Anfrage erhält nicht neu initialisiert, aber das hat mehr negative Nebenwirkungen auch. Eine weitere Lösung ist das Datenmodell Laden neu zu ordnen, so dass es in dem Bean-Konstruktor geschieht. Wie Sie bereits Tomahawk des <t:dataTable>
verwenden, müssen Sie sein preserveDataModel
Attribut true
einzustellen. Weitere Hinweise über Datentabellen verwenden, können Sie diesen Artikel nützlich finden: Datentabellen Mit .
Andere Tipps
Eine andere Sache zu Notiz über die Eigenschaft disabled für eine a4j: command: wenn die behinderte Eigenschaft auf true gesetzt ist, dann ist der Ajax-Haken für die OnClick-Ereignis der Schaltfläche wird nie in die endgültigen HTML gerendert. Das heißt, Sie auf eine Schaltfläche wie diese:
<input type="button" onclick="return false" ... />
anstelle dieses:
<input type="button" onclick="A4J.AJAX.Submit('....');return false" ... />
Also, wenn Sie wollen, so etwas tun:
- Render Seite mit behinderter a4j: Taste
- Aktivieren a4j: Taste auf Client-Seite basierend auf Interaktion mit dem Benutzer
- Klicken Sie auf a4j: Taste, um die Anrufserverseite Aktion
Dann werden Sie stattdessen brauchen so etwas wie dies zu tun:
- Render Seite mit a4j: Taste und disabled = "# {true}"
- Haben Sie die Interaktion mit dem Benutzer-Trigger kann eine erneute Rendern der a4j: Schaltfläche mit disabled = "# {false}"
- Klicken Sie auf das a4j: Taste, um die Server-Seite Aktion aufzurufen
Hier ist ein einfaches Beispiel:
<h:selectOneCheckbox value="#{myAction.booleanProperty}">
<a4j:support event="onclick" reRender="button1" />
</h:selectOneCheckbox>
<a4j:commandButton id="button1" action="#{myAction.doSomething}"
disabled="#{myAction.booleanProperty eq false}" value="click me"
/>