2011-09-13 21 views
16

tengo la siguiente situación:Primefaces onclick y diferencias onSuccess

después de hacer clic en un botón, un poco de lógica de negocio se hace y después se hace, una nueva pestaña con un informe debe ser visible.

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

Esto no funciona :(

Si la lógica de negocio sólo dura unos milisegundos, las siguientes obras:

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

el onclick se abre una nueva pestaña, también cosas como OnStart pero no funciona con onsuccess o oncomplete. ¿Por qué? ¿Y existe una solución para la lógica empresarial que dura unos segundos?

+0

su pregunta es confuso ... ¿qué quiere decir "lógica de negocio que dura algunos segundos "? ¿Está diciendo que desea llamar a 'window.open ('./ report.jsp', '_newtab');' después de que el lado del servidor actionListener 'businessLogic' esté completo? –

Respuesta

7

Me he dado cuenta de que onsuccess para el comando PrimeFaces butto n no funciona. Sin embargo, el oncomplete funciona y hace lo necesario incluso si hay un error, como en mi caso muestra un diálogo de éxito incluso si hay un error en mi lógica comercial. Intenté usarlo pero no funciona. Usted podría intentar onComplete de la siguiente manera:

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

onclick se llama antes de la solicitud de ajax de haber creado (lado del cliente puro), mientras que onComplete y onSuccess se ejecutan después de que el servidor ha respondido a la petición Ajax. Por lo tanto, si necesita ejecutar alguna lógica de negocios antes de mostrar un cuadro de diálogo, por ejemplo, desea ir en Completo. Eso es lo que siempre uso.

También puede condicionar su javascript en el interior en completar para realizar solo si no hay errores de validación. Intuitivamente, creo que un éxito se comportaría así y solo se ejecutaría cuando no hubiera errores de validación, pero no es así. Realmente no sé la diferencia entre ellos. Supongo que hay una manera de marcar el éxito = falso en los respaldos, pero realmente no pude encontrarlo en la documentación.

Si desea comprobar para su validación en el atributo onComplete, esto es cómo se haría:

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

En este caso, sólo sería cerrar el diálogo si los campos están debidamente validados. En realidad, puede insertar parámetros desde el bean de respaldo y usarlos en javascript después de que se haya servido la solicitud. En su bean de respaldo se puede hacer algo como esto:

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

Y se puede acceder al parámetro como este en su atributo incompleta:

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

De todos modos, espero que ayude.

+4

Necesitaba escapar de tha & symbols: \t oncomplete = "if (args & & args.showDialog) {dialog1.show()} else {alert ('el bean no me permitió abrir el diálogo')} " – 8bitjunkie