2016-05-24 11 views
0

Ich habe eine Ansicht wie so:Primefaces Form nicht aktualisiert im Dialog

<h:form id="productForm"> 
    <p:messages 
    id="productFormMessages" 
    autoUpdate="true" 
    redisplay="true" 
    globalOnly="true" /> 

    <p:panelGrid 
    id="detailsGrid"> 
    <p:row> 
     ... 
     <p:column> 
     ... 
     <p:outputLabel 
      id="fieldToUpdateId" 
      value="XYZ" /> 
     <p:commandButton 
      action="#{bean.prepareDialog}" 
      update="dialogFormId" 
      oncomplete="PF('dialogModal').show();" /> 
     </p:column> 
    </p:row> 
    </p:panelGrid> 
</h:form> 

<ui:include src="/../.../dialog.xhtml" /> 

Und das ist, was dialog.xhtml wie folgt aussieht:

<p:dialog 
    id="dialogId" 
    widgetvar="dialogModal" 
    appendTo="@(body)" 
    modal="true" 
    dynamic="true"> 

<h:form 
    id="dialogFormId"> 
    ...a selectOneMenu... 

    <p:commandButton 
    id="saveButtonId" 
    value="Save" 
    actionListener="#{bean.save}" 
    oncomplete="PF('dialogModal').hide();" 
    process="@form" 
    update=":productForm" /> 
    </h:form> 

Aber die Schaltfläche speichern weigert sich einfach, das Produktformular zu aktualisieren. Es aktualisiert productFormMessages (was ich vermute, ist wegen der AutoUpdate), aber das Formular wird nicht aktualisiert. Ich muss eine Seite neu laden vom Browser, damit es die neuesten Daten widerspiegelt. Ich habe viele verschiedene Wege ausprobiert. 1. Verwenden Sie p: component, um im Attribut update direkt auf outputLabel zu verweisen. 2. (1) auch mit der Formular-ID und der panelGrid ID. 3. Verwenden Sie die vollständige Client-ID (mit und ohne vorangestelltes ':') im Update-Attribut. Ähnliches mit der Formular-ID und der panelGrid ID. 4. Die Client-ID zu den Render-IDs in der Bean hinzufügen und dann die update-Methode partialViewContext aufrufen. 4. partialViewContext # setRenderAll auf true setzen. 4. Und als letzter Versuch, wie der Code zeigt, Aktualisierung der gesamten Produktform. Was nicht so schlimm ist, denn fieldToUpdateId ist nur eines der Felder, die ich im Formular aktualisieren muss. Aber so oder so, es funktioniert nicht.

Offensichtlich werden die Daten auf dem Backend gespeichert, weil ein Neuladen der Seite mir die neuesten Daten gibt. Aber ich kann den Dialog nur nicht dazu bringen, das Formular, von dem aus er aufgerufen wird, zu aktualisieren. Ich habe keine Ideen mehr. Was mache ich falsch?

+0

Sie verweisen auf das andere Formular korrekt. Überprüfen Sie Ihre Speichermethode, warum sie nicht aktualisiert wird. – tak3shi

+0

Die Aktualisierungsreferenz des Dialogfeldformulars ist jedoch nicht korrekt. Es muss 'update = 'sein: dialogFormId" '. Haben Sie die IDs in Ihrem Browser getestet? Ist "ProductForm" das Top-Level? – Holger

+0

Die Speichermethode ist riesig, daher ist es nicht sehr sinnvoll, sie zu komprimieren und hier zu speichern. Der Grund, warum ich aktualisiere: productForm ist, weil ich beim Speichern den Dialog schließe und die Meldung 'save successfully' auf productFormMessages anzeigt. Dies wird angezeigt. Ich bin mir sicher, dass die Speichermethode korrekt funktioniert hat. Und ja, ich habe die Client-IDs im Browser überprüft, productForm ist das Top-Level-Formular. – user1825770

Antwort

0

Theoretisch sollte dies funktionieren, aber bitte überprüfen Sie die Schaltfläche in der HTML-Quelle, um sicherzustellen, welcher Teil des HTML es aktualisiert. es sollte so etwas haben.

OnClick = "PrimeFaces.ab ({s: 'dialogFormId: saveButtonId1', u: 'Product', Onko: Funktion (XHR, Status, args) {PF ('dialogModal') verbergen();. ;}});falsch zurückgeben;"

+0

Ja, ich habe es so versucht, wie Sie es gezeigt haben. Ohne das ':'. Meine Taste hat tatsächlich eine ähnliche unvollständige Funktion, die Sie haben, ich habe das einfach aus dem hier angegebenen Code aus Gründen der Einfachheit ausgeschlossen, da dies die Seitenaktualisierung nicht beeinflussen kann. Die Funktion schließt nur den Dialog, wenn die Kontextvalidierung nicht fehlgeschlagen ist. – user1825770