Слушатели ExtJS: параметры анонимной функции - PullRequest
0 голосов
/ 04 августа 2010

Я взял этот код из какой-то книги, которую наткнулся на InternetS ...

sm: new Ext.grid.RowSelectionModel({
   singleSelect: true,
   listeners: {
       rowselect: {
           fn: function(sm,index,record) {
               Ext.Msg.alert('You Selected',record.data.title);
           }
       }
   }
});

сейчас, sm является сокращением для модели выбора, мы обсуждаем GridPanel ExtJS здесь ... Все ясно до части fn:. AFAIK, анонимная функция передается с 3 параметрами: sm, index и record.

Прямо сейчас я собираюсь получить голоса за то, что спросил что-то очень тривиальное: как узнать, какие параметры вы должны передать? Если я пропущу параметр индекса, я получу сообщение об ошибке ... Почему я должен передать 3 параметра? В чем подвох?

Ответы [ 2 ]

4 голосов
/ 04 августа 2010

Рассмотрим этот сценарий:

//called with (selectionModelInstance, Index, Record)
function myCallback(sm,index,record) {
  //Parameter mapping:
  //sm -> selectionModelInstance
  //index -> Index
  //record -> Record
  alert(record.data);
  //record is actually a record object, so record.data works
}

Посмотрите, что происходит, когда вы пропускаете параметр:

//called with (selectionModelInstance, Index, Record)
function myCallback(sm,record) {
  //Parameter mapping:
  //sm -> selectionModelInstance
  //record -> Index
  alert(record.data); //Error
  //record is actually Index here, and it obviosly doesn't have data property.
}

Ошибка, которую вы видите, не имеет ничего общего с несоответствием параметров при вызове функции,Javascript позволяет любой функции, принимающей любое количество параметров, вызываться с любым количеством параметров.Ошибка связана с попыткой разыменования свойства record.data, которого там нет.

Чтобы ответить на ваш вопрос, вы должны определить функцию обратного вызова, используя сигнатуру, указанную API, просто ради параметров.отображается правильно.

3 голосов
/ 04 августа 2010

Параметры не передаются по имени;они передаются по «позиции» (как и в большинстве других языков сценариев и программирования).Обратный вызов должен иметь три параметра, потому что вызывающая сторона предоставит три аргумента;в случае несоответствия произойдет ошибка.

...