Обработка событий с помощью jQuery, AMD и require.js

Я очень новичок в AMD и require.js и боролся с небольшой проблемой в течение почти дня. Я пробовал разные способы, но не уверен, что это правильный путь / правильный подход. Буду признателен за отзывы всех гуру JavaScript.

Я пытаюсь реализовать обработчик событий для текстового поля, которое будет прослушивать любые входные данные / изменения. В обработчике событий я хотел бы обновить маркер, который в данный момент отображается на карте. Итак, я определил два модуля - открытый для openlayers и один, содержащий мой собственный код для отображения карты, обновления маркеров и т. Д.

Пользовательский модуль выглядит следующим образом:

define('mymodule', [ 'open-layers', 'jquery', 'openstreetmaps','t5/core/console' ], function(
    openLayers, $,openStreetMaps ,console) {

    var init = function() {

    }
    var listenForChange = function(clientId) {
        clientId = clientId;
        var textBox = $(document.getElementById(clientId));
        console.debug(textBox);

        $('#addressLineTwo').on('change paste keypress input', function() {
            console.debug(textBox);
            console.debug('OnChange');
            console.debug($(this));
            console.debug($(textBox).val());
            openstreetmaps.clearMarkersAndShowAddress();
        });
    }
    return {
        init: init,
        listenForChange: listenForChange
    };
});

Проблема в том, что когда обработчик события вызывается в результате ввода в текстовое поле, openstreetmaps Переменная в функции, определенной как обработчик для метода "on" undefined,

Единственный способ, которым я мог обойти это, состоял в том, чтобы изменить эту строку на что-то вроде этого:

  require(['openstreetmaps'], function(openstreetmaps) { openstreetmaps.clearMarkersAndShowAddress(newAddress);});

Кроме того, если я использую такую ​​конструкцию, как мне управлять переменными и передавать данные между всеми этими замыканиями? Кажется, что внутреннее замыкание не может получить доступ к переменным из внешних замыканий или функций.

Буду очень признателен за вашу помощь и обратную связь.

1 ответ

Переменные из других ваших модулей доступны из обработчика событий, вам просто нужно изменить define параметр функции openStreetMaps в openstreetmaps, Вот почему дополнительный require звонок работает; вам просто нужно сопоставить имя переменной с требуемым модулем.

Для управления переменными просто предоставьте все открытые, возвращая их из модуля, и эти открытые переменные могут получить доступ ко всему, что определено в модуле, что создает замыкание. И каждый модуль регистрируется только один раз, так что вы можете сохранить любое состояние, которое вы хотите в каждом модуле.

Другие вопросы по тегам