Как добавить дополнительные параметры в обработчик ExtJS?

Я использую среду ExtJS, и у меня есть следующий обработчик, который используется исключительно как обработчик кнопки:

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

Мое определение кнопки выглядит так:

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

Как видите, обработчик получает ожидаемую «кнопку» и «событие». Однако я хотел бы передать некоторую дополнительную информацию в свой обработчик. Как бы я это сделал?


person Huuuze    schedule 27.03.2009    source источник


Ответы (4)


На самом деле я бы использовал прототип 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
});
person Ballsacian1    schedule 25.05.2009
comment
Это более элегантный ответ, чем ответ Себа. Работа по созданию обёртки скрыта с помощью createDelegate. При желании пользователь может добавить к кнопке пользовательское свойство и проверить его в обработчике. Я по-прежнему предпочитаю createDelegate. - person Juan Mendes; 22.09.2010
comment
Итак, как бы вы обработали это внутри функции myButtonHandler, чтобы использовать ваши [парамы]? Просто myButtonHandler([params])? - person dmackerman; 28.07.2011
comment
Я пошел дальше и изменил пример, чтобы лучше показать, что вы можете сделать с помощью createDelegate. Также в Ext4 и SenchaTouch createDelegate был перемещен из прототипа функции и теперь доступен только Ext.createDelegate(functionToDelegate, scope, args, appendOrInsertIndex) - person Ballsacian1; 29.07.2011
comment
привет, я хотел бы иметь более четкое представление об этом. я пытался, и, кажется, я все еще не понимаю. предположим, myButtonHandler.createDelegate(this, [param1, param2], appendBooleanOrInsertionIndex) где переменные param1, param2? если я хочу, например, `myButtonHandler.createDelegate(this, ['title', 'автор'], appendBooleanOrInsertionIndex)` в mybuttonHandler(){ //can i have this? alert(this.title); } what will then be the value of title? thanks } - person black sensei; 25.08.2011

В Ext JS 4:

Ext.bind(myButtonHandler, this, [params array], true);
person Bradley    schedule 11.05.2011
comment
Это также верно для ExtJS 3.4 (использование Ext.createDelegate) - person lcguida; 31.07.2014

Вы можете использовать хорошее решение, как предложил Брэдли. Вот пример. Где RepeatsStore - это дополнительный параметр, который я хочу передать обработчику кнопки.

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

И у вашего обработчика должно быть три параметра - первые два стандартные, а последний ваш.

addBtnHandler:function(button, event, repeatsStore)
{
}
person Oleksandr_DJ    schedule 15.02.2012

Я не знаю, что вы хотите передать, но использование оболочки может помочь:

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);
};
person Seb    schedule 27.03.2009
comment
Я предполагаю, что var handlerWrapper() должна быть функцией handlerWrapper(). Да? - person Huuuze; 27.03.2009