2009-03-27 10 views
5

ich den ExtJS Rahmen verwenden und ich habe die folgende Prozedur, die für eine Schaltfläche nur als Handler verwendet wird:Wie füge ich einem ExtJS-Handler zusätzliche Parameter hinzu?

var myButtonHandler = function(button, event){ 
    //code goes here 
}; 

sieht Meine Taste Definition wie folgt:

var myButton = new Ext.Button({ 
     id : 'myButton', 
     renderTo : 'mybutton', 
     text : 'Save', 
     handler : myButtonHandler, 
     scope : this 
    }); 

Wie Sie sehen können erhält der Handler den erwarteten "Button" und "Event". Ich möchte jedoch einige zusätzliche Informationen an meinen Handler weitergeben. Wie würde ich das tun?

Antwort

7

Ich würde eigentlich Exts CreateDelegate Prototyp verwenden.

var appendBooleanOrInsertionIndex = 0; // Inserts the variables into the front of the function. 
    appendBooleanOrInsertionIndex = true; // Appends the variables to the end of the arguments 

var myButton = new Ext.Button({ 
    id : 'myButton', 
    renderTo : 'mybutton', 
    text : 'Save', 
    handler : myButtonHandler.createDelegate(this, [param1, param2], appendBooleanOrInsertionIndex), 
    scope : this 
}); 
+1

Dies ist eine elegantere Antwort als die von Seb. Die Arbeit zum Erstellen eines Wrappers ist durch createDelegate verborgen. Optional könnte der Benutzer der Schaltfläche eine benutzerdefinierte Eigenschaft hinzufügen und diese vom Handler aus überprüfen. Ich bevorzuge immer noch createDelegate. –

+0

Also, wie würden Sie dies innerhalb der ** myButtonHandler ** -Funktion umgehen, um Ihre [params] zu verwenden? Nur myButtonHandler ([params])? – dmackerman

+0

Ich ging voran und modifizierte das Beispiel, um besser zu zeigen, was Sie mit createDelegate machen können. Auch in Ext4 und SenchaTouch wurde createDelegate aus dem Funktionsprototyp entfernt und ist nun nur noch über Ext.createDelegate (functionToDelegate, scope, args, appendOrInsertIndex) erreichbar. – Ballsacian1

3

Ich weiß nicht, was es ist, die Sie weitergeben wollen, aber ein Wrapper könnte helfen:

var myButtonHandler = function (button, event, additionalData){ 
    //code goes here 
}; 

var myButton = new Ext.Button({ 
    id : 'myButton', 
    renderTo : 'mybutton', 
    text : 'Save', 
    handler : handlerWrapper, 
    scope : this 
}); 

var handlerWrapper = function (button, event){ 
    // Fetch additional data 
    var additionalData = "whatever"; 
    myButtonHandler(button, event, additionalData); 
}; 
+0

Ich rate "var handlerWrapper()" sollte "function handlerWrapper()" sein. Ja? – Huuuze

+0

Ja, tut mir leid ... das jetzt korrigiert. Vielen Dank. – Seb

4

In Ext JS 4:

Ext.bind(myButtonHandler, this, [params array], true); 
+0

+1 Dies ist eine sehr schöne 1-Linien-Lösung für ExtJS 4+. – BenSwayne

+0

Dies gilt auch für ExtJS 3.4 (Verwendung von Ext.createDelegate) – lcguida

5

Sie eine gute Lösung verwenden können, wie Bradley vorgeschlagen hat. Hier ist ein Beispiel. Wo repeatsStore - es ist zusätzliche Parameter, die ich an einen Button-Handler übergeben möchte.

Ext.create('Ext.panel.Panel', { 
    name: 'panelBtn', 
    layout: 'hbox', 
    border: 0, 
    items:[ 
     {xtype: 'button', text: 'Add', name:'addBtn', 
     handler : Ext.bind(this.addBtnHandler, this, repeatsStore, true) 
     } 
    ] 
}); 

Und Ihre Handler sollte drei Parameter - ersten beiden sind Standard, und zuletzt ist Ihr.

addBtnHandler:function(button, event, repeatsStore) 
{ 
} 
Verwandte Themen