Использование .bind (mootools) с событием onClick - PullRequest
1 голос
/ 10 января 2010

У меня есть код (внутри одного объекта) onclick: this._addX.bind(this) а затем внутри другого объекта onclick: this._addY.bind(this)

Теперь _addX () и _addY практически идентичны, за исключением того, что оба они в конечном итоге вызывают (по событию click) функцию с различными значениями аргументов, например, _addX вызывает foo ('x') и _addY вызывает foo ('y' ). Итак, я попробовал:

onclick: this._add.bind(this,'x') и onclick: this._add.bind(this,'y') в двух объектах. И, конечно, я изменил _адд, чтобы принять аргумент.

Во время выполнения, когда вызывается _add, он не видит никаких входящих аргументов! Я возился с разными синтаксисами, но ничего не работает. Есть идеи? Оригинальный синтаксис работает нормально (без аргументов), но вынуждает меня дублировать большую функцию, используя только одну строку, что мне больно. Заранее спасибо.

_add: function(which) {
    var me = this;
    var checkFull = function(abk) {
        if (abk.isFull) {
            alert("full");
        } else {
        alert(which);  // which is always undefined here!
        }
    };
    getAddressBook(checkFull); //checkFull is a fn called by getAddressBook
},

Ответы [ 3 ]

3 голосов
/ 10 января 2010

это работает, и оно сохраняет область в событии click элемента с областью действия, установленной для класса, а не для элемента - нет смысла передавать область видимости в метод add, у него уже есть это:

var foo = new Class({
    Implements: [Options],
    add: function(what) {
        alert(what);
    },
    initialize: function(options) {
        this.setOptions(options);

        this.options.element.addEvents({
            click: function() {
                this.add(this.options.what);
            }.bind(this)
        });
    }
});

window.addEvent("domready", function() {
    new foo({
        element: $("foo"),
        what: "nothin'"
    });
});

просто создайте элемент с id = foo и щелкните по нему для проверки (ничего не предупреждает). если ваш onclick является обработчиком функции / события в вашем классе, в отличие от обычного события щелчка элемента, то ситуация будет немного отличаться - опубликуйте рабочий скелет вашей работы на http://mootools.net/shell/

1 голос
/ 10 января 2010

Если вы прочитали мой предыдущий ответ, не обращайте на него внимания.Метод MooTools .bind поддерживает передачу параметров.Итак, что-то еще работает не так, как вы ожидаете:

onclick: this._add.bind(this, 'y');

Вот простая настройка на JSBin , чтобы показать, как bind действительно передает параметры.

0 голосов
/ 10 января 2010

Цель связывания only состоит в том, чтобы "сообщить" JS, какой объект вы имеете в виду, когда говорите this. то есть вы передаете в качестве параметра bind экземпляр объекта, который вы хотите, чтобы ключевое слово this указывало внутри функции, в которой вы использовали bind.

...