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