2013-12-01 3 views
0

Мне нравится RequireJS и, наконец, имеет некоторую модульность/инкапсуляцию в Javascript, но я попал в ловушку при передаче обратных вызовов в другой модуль.Как мне перехватить обратный вызов/обработку событий с помощью RequireJS

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

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

Я пробовал:

  • привязки событие к элементу перед его передачей в функцию меню, но это не сработало.
  • передавая функцию обратного вызова в качестве второго параметра и связывания его в модуле меню

Ни один из них работал.

Любые идеи?

Некоторые код более подробно

Функциональный модуль меню

function addMenuItem(jqObj, evtHandler) { 
    console.log("Adding menu " + jqObj); 
    jqObj.click(evtHandler); 
    menuList.append($("<li>").append(jqObj)); 
} 



функцию в меню Вызов с помощью модуля

function addSelectionMenuItem() { 
    satInput = $("<input type=search placeholder='search' />"); 
    menuModule.addMenuItem(satInput, function() { 
     this.loadCzml(satInput.val()); 
     console.log("Checking execution..."); 
    }); 
} 

Спасибо!

ответ

0

Я сомневаюсь, что значение this - это значение, необходимое для обработчика событий. Измените вызов addMenuItem так, что он читает:

var self = this; 
menuModule.addMenuItem(satInput, function() { 
    self.loadCzml(satInput.val()); 
    console.log("Checking execution..."); 
}); 

Я добавил задание self перед вызовом и использовать self вместо this в функции обратного вызова. JQuery documentation на значении этого:

Когда JQuery вызывает обработчик, то this ключевое слово является ссылкой на элемент, где событие доставляется; для непосредственно связанных событий это элемент, где событие было присоединено, и для делегированных событий это элемент, соответствующий selector.

0

Изменения контекста обработчика событий с .bind()

jqObj.click(evtHandler.bind(this); 
0

Ок, это была не проблема модульной рамки с обратным вызовом Afterall.

Плагин, используемый в модуле меню, клонировал элементы html с использованием метода клонирования jquery. Однако он не передавал аргумент методу клонирования, поэтому он по умолчанию не клонировал никаких обработчиков.

Это означает, что входной сигнал, вызываемый вызывающим модулем, уже не был тем, что было видно на странице, клонированная версия была без обработчиков!

По крайней мере, плагин был с открытым исходным кодом, поэтому я мог видеть код.

Спасибо в любом случае :)

Смежные вопросы