skd: [Mootools] Funktionen als Parameter in .addEvent einbinden

Hi!

ich übergeben einer Funktion yesNo(msg, yes, no) bei yes und no Funktionen.
Die Funktion yesNo zeigt ein <div> mit 2 buttons (yes und no) und diese Buttons sollen dann die Funktionen im onClick Event haben. Dummerweise ruft Javascript immer diese Funktionen auf, wenn ich sie über .addEvent() einbinde.

Code:

  
function showYesNo(msg, yes, no) {  
    $("yesNo").setStyle("visibility", "visible");  
    $("yesNoMessage").innerHTML = msg;  
  
    if(yes) {  
        $("yesNoBoxBtnYes").addEvent('click', function() { yes; });  
    }  
    if(no) {  
        $("yesNoBoxBtnNo").addEvent('click',  function() { no; });  
    }  
}  

Gibt es da eine geschickte möglichkeit die ich nur nicht sehe?

  1. function showYesNo(msg, yes, no) {
        $("yesNo").setStyle("visibility", "visible");
        $("yesNoMessage").innerHTML = msg;

    if(yes) {
            $("yesNoBoxBtnYes").addEvent('click', function() { yes; });
        }
        if(no) {
            $("yesNoBoxBtnNo").addEvent('click',  function() { no; });
        }
    }

      
    Wenn yes und no Funktionsobjekte sind und du sie als Handlerfunktionen für das click-Ereignis verwenden willst, so kannst du einfach schreiben:  
      
    `$("yesNoBoxBtnYes").addEvent('click', yes);`{:.language-javascript}  
      
    Siehe auch [http://jsfiddle.net/NcUKQ/](http://jsfiddle.net/NcUKQ/)  
      
    Wenn du `function() { yes; }`{:.language-javascript} notierst, so notierst du eine neue Funktion, die in ihrem Anweisungskörper gar nichts tut. »`yes;`{:.language-javascript}« ist einfach eine (Ausdrucks-)Anweisung, die nur aus einem Bezeichner besteht. Der wird aufgelöst und das Ergebnis des Ausdrucks ist die Funktion yes, allerdings wird damit nichts gemacht.  
      
    yes ist schon (deiner Aussage zufolge) ein Funktionsobjekt, es ist nicht nötig, es noch einmal in eine Funktion zu verpacken. Du kannst yes direkt an addEvent() übergeben.  
      
    Mathias
    
    1. Hi,

      $("yesNoBoxBtnYes").addEvent('click', yes);

      ändert nichts an dem Problem. Ich glaube ich rufe die Funktion falsch auf.
      Ich hatte mir das so vorgstellt:
      showYesNo("wollen sie den Artikel löschen?", deleteArticle(id), hideYesNo);

      Ich vermute da liegt der Fehler begraben, oder?

      Gruß, skd

      1. Hi,

        Ich hatte mir das so vorgstellt:
        showYesNo("wollen sie den Artikel löschen?", deleteArticle(id), hideYesNo);

        Ich vermute da liegt der Fehler begraben, oder?

        Ja - da rufst du die Funktion deleteArticle ja direkt auf, und übergibst nur ihren Rückgabewert als Parameter an die Funktion.

        Wenn du einen Parameter an die Funktion übergeben willst, die beim Event aufgerufen werden soll, kannst du das bspw. über Closures machen.
        http://aktuell.de.selfhtml.org/artikel/javascript/organisation/

        MfG ChrisB

        --
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
      2. showYesNo("wollen sie den Artikel löschen?", deleteArticle(id), hideYesNo);

        Wie gesagt rufst du hier die Funktion deleteArtice mit dem Parameter id auf. Der Rückgabewert dieses Aufrufs (vermutlich undefined) wird dann als Parameter an die Funktion showYesNo übergeben. Dort kommt also kein Funktionsobjekt an.

        Was du vorhast, kannst du mit Currying lösen. Dabei erzeugst du eine Funktion, welche eine andere mit vordefinierten Parametern aufruft. Das lässt sich in Mootools mit der Methode pass von Funktionsobjekten lösen:

        showYesNo("wollen sie den Artikel löschen?", deleteArticle.pass(id), hideYesNo);

        Beispiel: http://jsfiddle.net/NcUKQ/2/

        deleteArticle.pass(id) gibt wiederum ein neues Funktionsobjekt zurück, welches beim Aufruf die Funktion deleteArticle mit dem Parameter id aufruft.

        Mathias

        1. Was du vorhast, kannst du mit Currying lösen. Dabei erzeugst du eine Funktion, welche eine andere mit vordefinierten Parametern aufruft. Das lässt sich in Mootools mit der Methode pass von Funktionsobjekten lösen:

          Wow! Danke, genau das hatte ich gesucht. Neben den Closures von ChrisB kam ich noch auf die Idee, die Funktion als String zu übergeben. Im Sinne von:

          showYesNo("blablabla", "deletearticle(\"" + id + "\", "hideYesNo");

          und dann halt in showYesNo sowas hier:

          function showYesNo(msg, yes, no) {  
            // HTML Zeug  
            var onClick = "<button onclick=\"" + yes + "\">Yes</button>;  
            // und so weiter
          

          }

          Aber danke für eure Hilfe!

          skiddo