Как добавить параметр в функцию обратного вызова, используя prototype.js?

Используя prototype.js, я создаю пользовательский объект, который будет параметром в конструкторе:

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

На опции oncalchange у меня есть функция обратного вызова, называемая "update", которая принимает параметр в myClass.

Теперь я хочу передать дополнительный параметр в функцию "update", но не напрямую в классе.

Я хотел бы сделать что-то подобное:

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

Очевидно, что это не работает, как я могу сделать что-то подобное?

2 ответа

Решение

В прототипе вы можете использовать функцию связывания (принадлежащую всем функциям) для предварительного заполнения значений и назначения контекста. Вместо этого вы можете использовать функцию карри, если вам не нужно использовать параметр context

например:

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

или же

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 для получения дополнительной информации о связывании и http://www.prototypejs.org/api/function/curry для получения информации о карриаде.

редактировать

измените функцию обновления на:

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

затем предварительно определите элемент, используя curry или bind, как указано выше.

Я предполагаю, что обратный вызов ожидает функцию с одним параметром, и вы хотите, чтобы она занимала секунду, которую вы можете определить при установке обратного вызова. В таком случае порядок параметров очень важен. curry и bind могут использоваться для предварительной загрузки аргументов с самого начала, и поэтому параметры, которые вы хотите предварительно загрузить, должны быть определены перед любыми другими параметрами. Надеюсь, это прояснит ситуацию.

Я не совсем уверен, что вы пытаетесь достичь, но что-то вроде этого?

var options = Object.extend({month: date[0],
                                 year: date[1],
                                 day: date[2],
                             oncalchange: function(d){ return update(d, 'somethingelse');}
                             });
Другие вопросы по тегам