web-dev-qa-db-de.com

Primaten bei Klick- und Erfolgsdifferenzen

Ich habe folgende Situation:

nachdem Sie auf eine Schaltfläche geklickt haben, wird einige Geschäftslogik ausgeführt, und danach sollte eine neue Registerkarte mit einem Bericht angezeigt werden.

<p:commandButton value="this button" update="growlMain"
                 actionListener="#{myBean.businesslogic}" 
                 onstart="ajaxDialog.show();"
                 oncomplete="ajaxDialog.hide();"
                 onsuccess="window.open('./report.jsp', '_newtab');" />

Das funktioniert nicht :(

Wenn die Geschäftslogik nur einige Millisekunden dauert, funktioniert Folgendes:

<p:commandButton value="this button" update="growlMain"
                 actionListener="#{myBean.fastbusinesslogic}" 
                 onclick="window.open('./report.jsp', '_newtab');" />

der onclick öffnet eine neue tab, auch Dinge wie onstart, funktioniert aber nicht mit onsuccess oder oncomplete. Warum? Und gibt es eine Lösung für Geschäftslogik, die einige Sekunden dauert?

16
Ziagl

Ich habe festgestellt, dass die Befehlsschaltfläche für den Erfolg von PrimeFaces nicht funktioniert. Das oncomplete funktioniert jedoch und erledigt das Notwendige, auch wenn ein Fehler auftritt, wie in meinem Fall ein Erfolgsdialogfeld angezeigt wird, auch wenn in meiner Geschäftslogik ein Fehler vorliegt. Es wurde versucht, onsuccess zu verwenden, funktioniert aber nicht .. __ Sie können versuchen, oncomplete wie folgt auszuführen:

<p:commandButton value="this button" update="growlMain"
                 actionListener="#{myBean.businesslogic}" 
                 onstart="ajaxDialog.show();"
                 oncomplete="ajaxDialog.hide(); window.open('./report.jsp', '_newtab');"/>
7
Gunjan Kalra

onclick wird aufgerufen, bevor die ajax-Anforderung überhaupt erstellt wird (reine Clientseite), während unvollständig und erfolgreich ausgeführt werden, nachdem der Server auf die ajax-Anforderung geantwortet hat. Wenn Sie beispielsweise vor dem Anzeigen eines Dialogs eine Geschäftslogik ausführen müssen, möchten Sie mit unvollständig fortfahren. Das benutze ich immer.

Sie können Ihr Javascript auch innerhalb von oncomplete so einstellen, dass es nur ausgeführt wird, wenn keine Validierungsfehler vorliegen. Intuitiv denke ich, dass sich onsuccess so verhalten und nur ausführen wird, wenn keine Validierungsfehler vorliegen, aber so läuft es nicht. Ich weiß nicht wirklich den Unterschied zwischen ihnen. Ich gehe davon aus, dass es eine Möglichkeit gibt, Erfolg in den Hintergrundbeans zu kennzeichnen, aber ich konnte es in der Dokumentation nicht wirklich finden.

Wenn Sie in Ihrem unvollständigen Attribut nach Gültigkeit prüfen möchten, gehen Sie folgendermaßen vor:

oncomplete="if (!args.validationFailed){someDialog.hide()}"

In diesem Fall würden Sie den Dialog nur schließen, wenn die Felder ordnungsgemäß geprüft wurden. Sie können tatsächlich Parameter aus der Backing-Bean einspeisen und sie im Javascript verwenden, nachdem die Anforderung geliefert wurde. In Ihrem Backing Bean können Sie so etwas tun:

RequestContext.getCurrentInstance().addCallbackParam("showDialog", false);

Und Sie können auf den Parameter wie folgt in Ihrem unvollständigen Attribut zugreifen:

oncomplete="if (args &amp;&amp; args.showDialog){someDialog.show()}else{ alert('the bean didnt let me open the dialog')}"

Jedenfalls hoffe ich, dass das hilft.

33
Andre

Sie können den Unterschied hier sehen:

Primefaces und ajax onsuccess event

oder mit onsuccess können Sie vor dem vollständigen Laden von DOM etwas tun

1
makkasi