Ich erstelle eine JavaScript-Komponente, die ich Instanzen von jQuery Ergebnisse erstellen, aber das DOM-Element, das ich in den Konstruktor übergeben, obwohl ausgefüllt, wenn ich durch die Schleife gehe im aufrufenden Code ist undefiniert, wenn es an den Konstruktor übergeben wird.JavaScript-Parameterwert 'wird' undefiniert, wenn an Konstruktor übergeben
Hier ist meine Klasse und Konstruktor ...
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 }
}
und hier ist der aufrufende Code (Dies ist eine Komponente-Manager, wenn Griffe Komponenten zu laden, basierend auf URLs/DOM Zustand etc) ...
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));
});
}
}
Dies verwendet die Funktion folgende Lader, um sicherzustellen, dass Gegenstände geladen werden ...
/**
* 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
};
Der Onload-Management-Code scheint gut zu laufen, und Code-Execution ist vollständig, wie erwartet, bis document.DeleteButtons.push(new DeleteButton(this));
- 'dies' hier ist das DOM-Element, wie ich erwarten würde, aber sobald der Debugger in den Controller tritt der Wert ist nicht definiert.
Ist das ein seltsamer Scoping-Schmerz, auf den ich gestoßen bin?
* "aber sobald die debugg Wenn man in den Controller tritt, ist der Wert undefiniert. "* Willst du sagen, dass' element' im 'DeleteButton' Konstruktor' undefiniert' ist? Nicht sicher, ich folge, was das Problem ist. Was Sie jedoch an DeleteButton übergeben, ist eine Instanz von 'JsComponentManager', kein Element. Siehe http://stackoverflow.com/q/34361379/218196. –
Nein - ich bin nicht (und ich weiß, es ist seltsam) "das" in jQuery ist jeder das Element selbst. Siehe meine Antwort unten für weitere Details. Im Wesentlichen ist jeder eine totale Scheußlichkeit, die aufgrund begrenzter Reichweite nicht in der Lage ist, das Element aus sich selbst heraus zu geben. –
Bitte werfen Sie einen Blick auf die Frage, die ich verlinkt habe. –