2011-09-30 11 views
6

Estoy refrescante con un UpdatePanel javscript llamando a un método de este modo:Devolución de llamada después de __doPostBack()?

reloadDropDown = function (newValue) 
{ 
    __doPostBack("DropDown1", ""); 
    selectNewValueInDropDown(newValue); 
} 

Dentro de mi UpdatePanel es una caja <select> que necesito para seleccionar un <option> con un nuevoValor. Mi problema es que se llama a mi método selectNewValueInDropDown antes de completar el __doPostBack. ¿Hay alguna manera de que pueda "esperar" la devolución de datos antes de llamar a mi método selectNewValueInDropDown?

Respuesta

11

para hacer mi comentario más concreto, aquí es la idea:

reloadDropDown = function (newValue) 
{ 
    var requestManager = Sys.WebForms.PageRequestManager.getInstance(); 

    function EndRequestHandler(sender, args) { 
     // Here's where you get to run your code! 
     selectNewValueInDropDown(newValue); 

     requestManager.remove_endRequest(EndRequestHandler); 
    } 
    requestManager.add_endRequest(EndRequestHandler); 

    __doPostBack("DropDown1", ""); 
} 

Por supuesto, es probable que quieren manejar las condiciones de carrera, donde se superponen dos peticiones. Para manejar eso, necesitaría hacer un seguimiento de qué manejador es para cada solicitud. Puede usar algo como ScriptManager.RegisterDataItem en el lado del servidor, o llamar al args.get_panelsUpdated() y verificar si el panel que le interesa ha sido actualizado.

+0

Impresionante. ¡Gracias! – RayLoveless

6
Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(BeginRequestHandler); 
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler); 
function BeginRequestHandler(sender, args) 
{ 
    // 
} 
function EndRequestHandler(sender, args) 
{ 
    //request is done 
} 
+0

Pero, ¿dónde entraría en juego mi parámetro? También necesitaría un método de punto de entrada único. –

+0

Tendrá que ser astuto con JavaScript y establecer algunas variables de estado para saber cuándo disparar su método. Cuando secuestras el marco/proceso está en ti. –

+0

@BrianDavidBerman: podría escribir una función que llame a 'selectNewValueInDropDown (newValue)' y luego llamará a 'Sys.WebForms ... remove_endRequest (theFunction)' para eliminarse como un manejador de eventos. –

Cuestiones relacionadas