Как добавить параметр в функцию обратного вызова, используя 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');}
});