2010-06-29 3 views

Antwort

3

Warum Sie nicht auf den Rückgabewert in den Rückruf selbst wirken? Es nimmt den zusätzlichen Scheck (das wird nicht funktionieren, wie Sie es erwarten würden).

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

    else { 
     doSomethingElse(); 
    } 
}); 

Rückrufe funktionieren nicht synchron. Sie werden verwendet, um Dinge zu behandeln, die asynchron passieren (wie Ereignisse). Im Kontext von Callbacks handelt es sich um Codeabschnitte, die ausgeführt werden, wenn etwas passiert. Die Rückgabe von Werten ergibt keinen Sinn. Da Sie in Ihrem Beispiel den Rückgabewert des Rückrufs überprüfen möchten, können Sie sicher sein, dass Sie nur einen Rückgabewert erhalten, wenn der Rückruf ausgeführt wird (weil Sie versuchen, sie wie eine normale Funktion zu verwenden). In diesem Fall lege diese Logik in den Callback selbst (wie ich oben gezeigt habe).

+0

Ich versuche zu vermeiden, das aus dem einfachen Grund, dass ich mehrere Formulare in einem Dialog habe (jeweils in einem separaten Tab). Ich möchte, dass der Dialog selbst die "save" -Methode jedes Formulars basierend auf einem "dreckigen" Flag aufruft. Deshalb versuche ich, die Funktionen "doSomething()" und "doSomethingElse()" aus den Formularen herauszufiltern - das heißt, das Hauptdialogfeld behandelt den Gesamtablauf. Ich möchte nur, dass jedes der Formulare mit dem Speichern ihrer Daten fertig wird - oder dass es false zurückgibt, wenn beim Speichern der Daten ein Fehler auftritt. Ist es möglich, mit .extend() eine benutzerdefinierte "Speichern" -Funktion zu jedem Formular hinzuzufügen? – Dave

+0

Warum haben Sie keine Validierungsmethode, die die Validierung behandelt? Sie sollten an das Ereignis "submit" Ihres Formulars binden und dann die Validierung ausführen. Wenn die Validierung erfolgreich ist, senden Sie das Formular. –

+0

Wäre es nicht möglich, eine neue Funktion namens 'save' oder 'saveData' hinzuzufügen, genau wie es das Validierungs - Plugin tut, um dem Formular eine neue Funktion hinzuzufügen und dann diese Methode zum Speichern der Daten? Ich habe kein Plugin erstellt, aber das scheint der elegantere Weg zu sein, um das zu erreichen, was ich versucht habe, nein? – Dave

8

Ich weiß, dass diese Frage alt ist, aber vielleicht kann das jemandem helfen.

Wie Paliath gezeigt hat, können Sie keinen Wert zurückgeben, da das Triggerereignis asynchron ist. Sie können ein Objekt als Parameter an das Ereignis übergeben. Standardmäßig sind JavaScript-Objekte immer Referenzen auf das Original.

zB .:

binden:

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

Auslöser:

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

Funktioniert das mit Ajax? –

+0

Potentiell, ja. Wenn richtig verwendet :) – dmmd

+0

Nein, es wird nicht. Sie übergeben die Referenz des Objekts (true) an den Ereignistrigger und lösen ihn aus. Der Event-Handler ändert den Wert async mit ajax auf false. Angenommen, Ajax ist in 10 Sekunden abgeschlossen. In 10 Sekunden ist der Wert also falsch geworden. Aber Sie überprüfen es sofort nach dem Trigger und Sie erhalten einen falschen Wert von True. Ich hoffe ich war klar. –

5

Check out triggerHandler(), die auf viele andere Arten wie trigger() wirkt aber ermöglicht es Ihnen, einen Wert zurückgeben.

Aus der Dokumentation:

Die .triggerHandler() Methode verhält sich ähnlich(), um .trigger mit den folgenden Ausnahmen:

  • Die .triggerHandler() Methode führt nicht zu der Standardverhalten eines Ereignisses (z. B. eine Formularübergabe).
  • Während .trigger() für alle Elemente gilt, die vom jQuery-Objekt abgeglichen werden, wirkt sich .triggerHandler() nur auf das erste übereinstimmende Element aus.
  • Ereignisse, die mit .triggerHandler() erstellt wurden, bringen die DOM-Hierarchie nicht zum Platzen; Wenn sie nicht direkt von dem Zielelement behandelt werden, tun sie nichts .
  • Anstatt das jQuery-Objekt zurückzugeben (um die Verkettung zu ermöglichen), gibt .triggerHandler() den Wert zurück, der vom letzten -Handler zurückgegeben wurde, der ausgeführt wurde.Wenn keine Handler ausgelöst werden, es gibt undefined zurück
4

Sie auch gebautet jQuery event.preventDefault() und event.isDefaultPrevented() verwenden können:

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

und dann:

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