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!

War es hilfreich?

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:

  1. Render Seite mit behinderter a4j: Taste
  2. Aktivieren a4j: Taste auf Client-Seite basierend auf Interaktion mit dem Benutzer
  3. Klicken Sie auf a4j: Taste, um die Anrufserverseite Aktion

Dann werden Sie stattdessen brauchen so etwas wie dies zu tun:

  1. Render Seite mit a4j: Taste und disabled = "# {true}"
  2. Haben Sie die Interaktion mit dem Benutzer-Trigger kann eine erneute Rendern der a4j: Schaltfläche mit disabled = "# {false}"
  3. 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"
/>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top