Nano Hash - криптовалюты, майнинг, программирование

Использование .bind (mootools) с событием onClick

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

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

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

Во время выполнения, когда вызывается _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
},

  • @ Дэйв, твой код должен работать, но это не так. Можете ли вы опубликовать объявление метода _add, чтобы мы могли устранить неполадки? 10.01.2010
  • Хорошо, вы правы. Это выглядит хорошо. (Я также исправил отступы) Единственные два известных мне способа определить событие в MooTools — это конструктор ({ events: { 'click': function(){ ... } }) или использование addEvent. Как именно вы подключаете функцию onclick? 10.01.2010
  • фактически создание кнопки в YUI и использование там атрибута onClick:. var btn_Add = new CO.GG.widget.Button({id: 'добавить', label: 'добавить X', onclick: this._add.bind(this,'x') }); Интересно, «который» (в верхнем посте) просто не выживает от _add до обратного вызова для checkFull ()? 10.01.2010
  • не могу понять как форматировать комментарии... 10.01.2010
  • Это не должно быть проблемой, но для проверки просто предупредите which сразу после открытия функции. Пока я собираюсь посмотреть, как YUI обрабатывает onclick. Также: используйте обратные кавычки вокруг фрагментов кода в комментариях и четыре пробела в вопросах и ответах. 10.01.2010
  • спасибо - вы помогли. Вы правы - он уже не определен при входе в _add(). Я должен остановиться на ночь. 10.01.2010

Ответы:


1

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

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

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

10.01.2010
  • Я попробую это. Не соответствует документам mootools, но... (в этих документах синтаксис показан как myFunction.bind([bind[, args[, evt]]]); что подразумевает this._add.bind(this,'x') ... не так ли? ‹обновление: попробовал этот синтаксис, все еще нет кости.› 10.01.2010
  • @Dave Дэйв игнорирует мой первый ответ. Извините, что я послал вас в неправильном направлении. 10.01.2010
  • Я разместил код после своего первоначального вопроса (упрощенный для защиты невиновных). Он не отформатирован правильно, кажется, потеряны переводы строки... 10.01.2010
  • так что ваша штука JSBin доказывает, что я понимаю .bind - должно быть onClick или все обратные вызовы как-то меня портят. 10.01.2010

  • 2

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

    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/оболочка/

    10.01.2010
  • благодаря. Это, кажется, меняет проблему по сравнению с той, которую я опубликовал. У меня нет свободы изменить все, что уже написано. Я просто хочу взять два фрагмента почти идентичного кода и изменить их на один с параметром, который будет определять их различия. Спасибо, в любом случае. 11.01.2010
  • эээ, тогда странно, потому что ваше исходное решение работает для меня: mootools.net/shell/zD7Hz 11.01.2010

  • 3

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

    10.01.2010
  • Возможно, я неправильно понял документацию mootools по .bind, но вы говорите, что я не могу отправить аргумент связанной функции, как я пытаюсь сделать здесь? Кажется маловероятным.... и я надеюсь, что это неправда. Вы кажетесь более опытным, чем я, но это именно mootools .bind, а не просто бинд - спасибо 10.01.2010
  • Нет, вы прекрасно поняли документы. @ Возможно, ваш ответ неверен в соответствии с документацией MooTools: mootools.net/docs/core /Native/Function#Function:bind 10.01.2010
  • @Doug Neiner Что касается событий, я считаю, что я прав. Если вы можете получить пример кода, который показывает обратное, то мы оба получили новые знания. 11.01.2010
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..