2009-06-08 4 views
1

Mit prototype.js ich ein benutzerdefiniertes Objekt erstellen, die ein Parameter für einen Konstruktor sein wird:Wie füge ich einen Parameter in einer Rückruffunktion mit prototype.js hinzu?

var options = Object.extend({month: date[0], 
          year: date[1], 
          day: date[2], 
          oncalchange: update}); 
// update is defined like that : 
var update = function(d){ 
    // bla bla 
} 

// Calling my class 
var myObject = new myClass (options); 

Auf der oncalchange Option habe ich eine Callback-Funktion „update“ genannt, die innerhalb eines Parameters nimmt meine Klasse.

Nun möchte ich einen zusätzlichen Parameter an die Funktion "update" übergeben, aber nicht direkt in der Klasse.

würde Ich mag, so etwas tun:

// element is the parameter I want to add 
var update = function(d, element){ 
    alert(element); 
} 

Offensichtlich ist es nicht funktioniert, wie ich etwas Ähnliches tun könnte?

Antwort

1

Im Prototyp können Sie die Bindefunktion (die zu allen Funktionen gehört) verwenden, um Werte vorzufüllen und einen Kontext zuzuweisen. Sie können die Curry-Funktion verwenden, anstatt, wenn Sie die Kontextparameter nicht

zum Beispiel verwenden müssen:

var options = Object.extend({month: date[0], 
           year: date[1], 
           day: date[2], 
          oncalchange: update.bind(this,arg1, arg2)}); 

oder

var options = Object.extend({month: date[0], 
           year: date[1], 
           day: date[2], 
          oncalchange: update.curry(arg1,arg2)}); 

http://www.prototypejs.org/api/function/bind Siehe für weitere Informationen zu binden, und http://www.prototypejs.org/api/function/curry für Informationen über Curry

Bearbeiten

Ihre Update-Funktion ändern:

var update = function(element,d){ 
    alert(element); 
} 

dann das Element mit Curry vordefinieren oder wie oben binden.

Ich nehme an, der Callback erwartet eine Funktion mit einem Parameter und Sie wollen, dass er eine Sekunde braucht, die Sie beim Einstellen des Callbacks definieren können. In diesem Fall ist die Reihenfolge der Parameter sehr wichtig. curry und bind können verwendet werden, um Argumente von Anfang an vorzuladen. Daher sollten die Parameter, die Sie vorbeladen möchten, vor jedem der anderen Parameter definiert werden. Hoffentlich werden dadurch die Dinge geklärt.

+0

Ja, ich habe die Bindefunktionen ausprobiert. Aber ich bekomme eine "undefined" Variable mit Bind oder Curry. update.bind (diese, 'ok') ... update.curry ('ok'); ... var update = Funktion (d, el) { console.log (el); // el ist undefined } – kevin

+0

In Ihren Beispielen übergeben Sie nur einen Wert an die Funktion. curry und bind pre-load von Anfang an ... Ich werde bearbeiten –

+0

Danke, aber selbst wenn ich die Reihenfolge ändern, wird "Element" "d" und "d" ist undefiniert. – kevin

1

Ich bin nicht ganz sicher, was Sie zu erreichen versuchen, aber so etwas?

+0

"Element" ist undefined mit diesem. Eigentlich instanziiere ich einen Kalender und oncalchange ist eine Ereignisfunktion (Prototype.emptyFunction) aufgerufen, wenn ich den Wert im Kalender ändern. – kevin

Verwandte Themen