2016-06-30 5 views
0

Ich bin ein Neuling in JavaScript. Hier möchte ich ein Modul erstellen, das angepasstes Attribut und verwandtes Verhalten ermöglicht.

Als erstes importiere ich zu Beginn von customised.ts Directive und ElementRef, während ich Jquery unter main.ts importiert habe. Deshalb schließe ich [customised.ts] nur

import {Directive, ElementRef} from '@angular/core'; 
declare var jQuery: any; 

@Directive ({ 
    selector: '[customised]' 
}) 

Der folgende Code ist Klasse zu exportieren, und Problem ist, wenn ich das nennen. $ El innerhalb der Event-Listener-Funktion, die dies. $ El undefiniert wird.

export class ClearInput { 
    $el: any; 

    constructor(el: ElementRef) { 
    this.$el = jQuery(el.nativeElement); 
    } 


    render():void { 
    let toggleClass = (variable) => { 
     return variable ? 'addClass' : 'removeClass'; 
    }; 

    this.$el.addClass('customised') 
    .bind('input', function() { 
     this.$el[toggleClass(this.$el.val())]('x'); 
    }) 
    .on('mousemove', function(e) { 
     if(this.$el.hasClass('x')) { // error 
     this.$el[toggleClass(this.$el.val())]('onX'); 
     } 
    }) 
    } 

    ngOnInit(): void { 
    this.render(); 
    } 
} 

Die Frage ist:.

  1. warum dieser $ el.addClass zweimal ausgeführt wird?
  2. Warum dies. $ El unter "Wenn" -Steuerfluss ist undefiniert, dann wirft es einen Fehler: TypeError: Kann die Eigenschaft 'hasClass' von undefined nicht lesen.

Antwort

0

dies. $ El ist nicht definiert, weil diese wird höchstwahrscheinlich durch jquery geändert, wenn der Zuhörer mousemove- aufrufen.

Wenn Sie den gleichen Kontext im Listener beibehalten möchten, können Sie stattdessen eine Pfeilfunktion verwenden.

.on('mousemove', e => { 
    if (this.$el.hasClass('x')) { 
    this.$el[toggleClass(this.$el.val())]('onX'); 
    } 
}) 

Wie, warum addClass zweimal ausgeführt wird, vielleicht die machen Funktion wird zweimal ausgeführt?

+0

Dank. Ich bin ein wenig vorsichtig bei der Verwendung der Pfeilfunktion. Wenn der Ausdruck unter if control flow lautet: this. $ El [toggleClass (this.offsetWidth)] ('onX'); Dann wird this.offsetWidth nicht wie erwartet funktionieren. Wie würde dies verbessert werden? –

+0

Nun, eine Sache, die ich tun würde, ist aufhören, jquery zu verwenden. Angular2 bietet Ihnen Möglichkeiten, mit Klicks auf Elemente umzugehen. Versuchen Sie diese zu verwenden. Andernfalls müssen Sie es auf die alte Art und Weise tun, indem Sie reguläre Funktionen verwenden und $ this.el in einer lokalen Variable in render speichern. – toskv

+0

Super! Dies ist sicherlich keine gute Praxis, um js-Code in angular2 Projekt zu schreiben. Aber wenn einige der früheren Arbeiten von js-Plugins nach angular2 migrieren, ist es sehr zeitsparend, wenn Sie "let self = this. $ El" zuweisen und dann die Pfeilfunktionen verwenden. Vielen Dank. –

1

ändern

constructor(el: ElementRef) { 
    this.$el = jQuery(el.nativeElement); 
    } 

zu

ngAfterViewInit(el: ElementRef) { 
    this.$el = jQuery(el.nativeElement); 
    } 
Verwandte Themen