2010-06-29 8 views

Respuesta

3

¿Por qué no se actúa sobre el valor de retorno en la propia devolución de llamada? Le quita el cheque extra (que no funcionará como lo esperaría).

$("#aForm").bind ('save', function() { 
    if(some stuff happens that is true) { 
     doSomething(); 
    } 

    else { 
     doSomethingElse(); 
    } 
}); 

Las devoluciones de llamada no funcionan sincrónicamente. Se usan para manejar cosas que suceden de forma asincrónica (como eventos). En el contexto de las devoluciones de llamadas, son piezas de código que se ejecutan cuando sucede algo. Devolver valores de ellos realmente no tiene sentido. En su ejemplo, dado que desea verificar el valor de retorno de la devolución de llamada, puede estar seguro de que solo obtiene un valor de retorno cuando se ejecuta la devolución de llamada (porque está tratando de usarlos como una función normal). En ese caso, ponga esa lógica dentro de la devolución de llamada en sí (como he mostrado arriba).

+0

Estoy tratando de evitar haciendo eso por la sencilla razón de que tengo múltiples formularios en un diálogo (cada uno en una pestaña separada). Me gustaría que el cuadro de diálogo se encargue de llamar al método de "guardar" de cada forma de forma individual en función de una bandera "sucia". Es por eso que estoy tratando de abstraer las funciones "doSomething()" y "doSomethingElse()" de los formularios, es decir, el cuadro de diálogo principal maneja el flujo general. Solo quiero que cada uno de los formularios maneje guardar sus datos, o devolver falso si ocurre un error al guardar sus datos. ¿Es posible agregar una función de "guardar" personalizada a cada formulario usando .extend()? – Dave

+0

¿Por qué no tiene un método de validación que maneje la validación? Debería enlazar al evento 'submit' de su formulario y luego ejecutar la validación. Si la validación es exitosa, envíe el formulario. –

+0

En esa misma línea, ¿no sería posible para mí agregar una nueva función llamada 'guardar' o 'guardar Datos' tal como lo hace el complemento de validación para agregar una nueva capacidad al formulario, y luego usar ese método para guardar el ¿datos? No he hecho un complemento, pero esta parece ser la manera más elegante de lograr lo que estaba tratando de hacer, ¿no? – Dave

8

Sé que esta pregunta es antigua, pero tal vez esto pueda ayudar a alguien.

Como señala Paliath, no puede devolver un valor porque el evento desencadenante es asincrónico. Lo que puede hacer es pasar un objeto como parámetro al evento. Por defecto, los objetos javascript son siempre referencias al original.

ej .:

aprieto:

$(...).bind('example',function (evt,ret) { 
    ret.val = false; 
}); 

gatillo:

var ret = {ret:true}; 
$(...).trigger('example',[ret]); 
if (!ret.ret) 
    //event return false 
else 
    //event returned true 
+0

¿Funcionará esto con Ajax? –

+0

Potentialy, sí. Si se usa correctamente :) – dmmd

+0

No, no. Pasa la referencia del objeto (verdadero) al desencadenador de evento y lo desencadena. El controlador de eventos altera el valor async con ajax a falso. Digamos que ajax completa en 10 segundos. Entonces, en 10 segundos, el valor se habrá convertido en falso. Pero lo verifica inmediatamente después del activador y obtiene un valor incorrecto de verdadero. Espero haber sido claro. –

5

Salida triggerHandler(), que en muchas otras formas actúa como trigger() pero le permitirá devolver un valor.

A partir de los documentos:

El .triggerHandler() método se comporta de manera similar a .trigger(), con las siguientes excepciones:

  • El método .triggerHandler() no hace que el comportamiento predeterminado de un evento que se producirá (como el envío de un formulario).
  • Mientras .trigger() operará en todos los elementos que coincidan con el objeto jQuery, .triggerHandler() solo afecta al primer elemento coincidente.
  • Los eventos creados con .triggerHandler() no generan la jerarquía DOM; si no son manejados por el elemento objetivo directamente, no hacen nada.
  • En lugar de devolver el objeto jQuery (para permitir el encadenamiento), .triggerHandler() devuelve el valor que devolvió el último controlador que causó la ejecución.Si no se activan los manipuladores, se devuelve undefined
4

También puede utilizar jQuery builtin event.preventDefault() y event.isDefaultPrevented():

$("#aForm").bind ('save', function (event) { 
    return true; 
    // "return false" or "event.preventDefault()" have the same effect 
    } 
}); 

y luego:

var event = $.Event('save') 
$("#aForm").trigger (event) 
if (event.isDefaultPrevented() == false) { 
    doSomething(); 
} 
Cuestiones relacionadas