2009-03-27 11 views
5

estoy usando el marco ExtJS y tengo el siguiente controlador que se utiliza únicamente como un controlador para un botón:¿Cómo agrego parámetros adicionales a un controlador ExtJS?

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

Mi definición del botón tiene el siguiente aspecto:

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

Como se puede ver , el controlador recibe el "botón" y el "evento" esperado. Sin embargo, me gustaría pasar algo de información adicional en mi controlador. ¿Como podría hacerlo?

Respuesta

7

De hecho, me utilizar prototipo Exts CreateDelegate.

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

Esta es una respuesta más elegante que la de Seb. El trabajo de crear un contenedor está oculto por createDelegate. Opcionalmente, el usuario podría agregar una propiedad personalizada al botón e inspeccionarlo desde el controlador. Aún prefiero createDelegate. –

+0

Entonces, ¿cómo manejarías esto dentro de la función ** myButtonHandler ** para usar tus [params]? Sólo myButtonHandler ([params])? – dmackerman

+0

Seguí adelante y modifiqué el ejemplo para mostrar mejor lo que puede hacer con createDelegate. También en Ext4 y SenchaTouch createDelegate se ha movido fuera del prototipo de función y ahora solo es accesible por Ext.createDelegate (functionToDelegate, scope, args, appendOrInsertIndex) – Ballsacian1

3

No sé qué es lo que desea pasar, pero utilizando un envoltorio podría ayudar:

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

Supongo que "var handlerWrapper()" debería ser "function handlerWrapper()". ¿Sí? – Huuuze

+0

Sí, lo siento ... corregido eso ahora. Gracias. – Seb

4

En Ext JS 4:

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

+1 Esta es una muy buena solución de 1 línea para ExtJS 4+. – BenSwayne

+0

Esto también es cierto para ExtJS 3.4 (El uso de Ext.createDelegate) – lcguida

5

Se puede utilizar una buena solución como ha sugerido Bradley. Aquí hay un ejemplo. Where repeatsStore - es un parámetro adicional que quiero pasar a un manejador de botones.

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) 
     } 
    ] 
}); 

Y el controlador debe tener tres parámetros - dos primeros son estándar, y la última es su.

addBtnHandler:function(button, event, repeatsStore) 
{ 
} 
Cuestiones relacionadas