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

Используя 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 ]

1 голос
/ 08 июня 2009

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

например:

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 могут использоваться для предварительной загрузки аргументов с самого начала, и поэтому параметры, которые вы хотите предварительно загрузить, должны быть определены перед любыми другими параметрами.

1 голос
/ 08 июня 2009

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

var options = Object.extend({month: date[0],
                                 year: date[1],
                                 day: date[2],
                             oncalchange: function(d){ return update(d, 'somethingelse');}
                             });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...