Я создаю компонент JavaScript, который я создаю экземпляры на основе результатов jQuery, однако элемент DOM, который я передаю в конструктор, хотя и заполняется, когда я перехожу через цикл в вызывающем коде, не определено при передаче конструктору.Значение параметра JavaScript становится «undefined при передаче конструктору
Вот мой класс и конструктор ...
export default class DeleteButton {
/**
* Creates an instance of DeleteButton.
*
* @param {object} element The DOM element to make into a delete button.
*
* @memberOf DeleteButton
*/
constructor(element) {
this.id = element.getAttribute("data-id");
if (!this.id) throw new Error("The 'data-id' attribute is required.");
this.deleteUri = element.getAttribute("data-delete-uri");
if (!this.deleteUri) throw new Error("The 'data-delete-uri' attribute is required.");
$(element).click(this.confirmRemove);
}
confirmRemove() { // does something }
}
и вот код вызова (Это компонент менеджер, который обрабатывает, когда для загрузки компонентов на основе URL-адресов/DOM состояния и т.д.) ...
export default class JsComponentManager {
constructor(onLoader) {
this._loader = onLoader;
this.select = {
deleteButtons:() => $(".js-delete-button")
}
this.result = 0;
}
bindComponents() {
const paths = new PathManager();
let $deleteButtons = this.select.deleteButtons()
if ($deleteButtons.length > 0) {
this._loader.add(this.renderDeleteButtons, $deleteButtons);
}
}
renderDeleteButtons($elements) {
$elements.each(() => {
document.DeleteButtons = document.DeleteButtons || [];
document.DeleteButtons.push(new DeleteButton(this));
});
}
}
При этом используется следующая функция загрузчика, чтобы гарантировать, что загружаются элементы ...
/**
* Adds an event to the onload queue.
*
* @param {function} func The function to add to the queue.
* @param {any} param1 The first (optional) parameter to the function.
* @param {any} param2 The second (optional) parameter to the function.
*/
var AddLoadEvent = function (func, param1, param2) {
var oldonload = window.onload;
if (typeof window.onload !== "function") {
window.onload =() => { func(param1, param2); };
} else {
window.onload =() => {
if (oldonload) { oldonload(); }
func(param1, param2);
};
}
};
module.exports = {
add: AddLoadEvent
};
Код управления нагрузкой, похоже, работает нормально, и, шаг за шагом, выполнение кода полностью ожидалось до document.DeleteButtons.push(new DeleteButton(this));
. «Это» здесь элемент DOM, как и следовало ожидать, но как только отладчик переходит в контроллер, значение не определено.
Является ли это какой-то странной болезненной болью, в которую я вошел?
* "но как только отладка er в контроллер, значение не определено ». * Вы говорите, что' element' является 'undefined' в конструкторе' DeleteButton'? Не уверен, что я понимаю, в чем проблема. Однако то, что вы передаете 'DeleteButton', является экземпляром' JsComponentManager', а не элементом. См. Http://stackoverflow.com/q/34361379/218196. –
Нет - я не (и я знаю, что это странно), «это» в jQuery, каждый из них является самим элементом. См. Мой ответ ниже для более подробной информации. По сути, каждый jQuery представляет собой полный ужас, который, похоже, не может передать элемент из себя из-за ограниченного объема. –
Пожалуйста, взгляните на вопрос, с которым я связан. –