2017-10-24 8 views
1

ホイールイベントリスナーは、直ちに削除する必要があります。私は以下を試みたが、イベントリスナーを削除しなかった。アンギュラ4のEventListenersを削除するには

export class HomeComponent implements OnInit { 

    constructor() {} 

    ngOnInit() { 
     document.querySelector("#section-one").addEventListener("wheel",() => this.myFunction1(), true); 
    } 

    myFunction1() { 
     alert(); 
     document.querySelector("#section-one").removeEventListener("wheel", this.myFunction1, true); 
     console.log("Done!"); 
    } 
} 

いずれかの提案がありますか?

答えて

2

Calling removeEventListener() with arguments that do not identify any currently registered EventListener on the EventTarget has no effect.

あなたのコードが動作しないはずです。次のように

可能な修正があってもよい:wheelHandler

wheelHandler: any; 

ngOnInit() { 
    this.wheelHandler = this.myFunction1.bind(this); 
    document.querySelector("#section-one").addEventListener("wheel", this.wheelHandler, true); 
} 

myFunction1() { 
    alert(); 
    document.querySelector("#section-one").removeEventListener("wheel", this.wheelHandler, true); 
    console.log("Done!"); 
} 

をより角度方法溶液のハンドラ

の同じインスタンスを参照する機能が参照

しかし、AFAIK useCaptureパラメータはまだサポートされていません。常にそうですfalse

+0

それは動作します!ありがとうございました。 –

+0

これは、イベントリスナーの追加と削除の方法とは異なります。 – cyrix

+0

@cyrix私はそれを知っています。また、この問題についても認識しておく必要があります。https://github.com/angular/angular/issues/11200 – yurzui

1

クラスメソッドをコールバック関数として使用すると、thisはコールバック関数のクラスを指していない可能性があります。

は、イベントリスナーを追加する代わりに、このコードを使用します。this.myFunction1() => this.myFunction1()なったこと

document.querySelector("#section-one") 
    .addEventListener("wheel",() => this.myFunction1(), true); 

注意。言い換えれば、私はラムダの中でコールバック関数の名前をラップしました。最後に

document.querySelector("#section-one").removeEventListener("wheel", this. myFunction1, true); 

を、そして最も重要なのは、なぜあなたはそのようなイベントリスナーを使用している:

リスナーを削除するコードは同じまま?これは間違いなく角度の方法ではありません。 the docsによると

+0

エラー:core.es5.js:1020 ERRORの例外TypeError: 'のEventTarget' on 'には、removeEventListener' を実行に失敗しました:必要な2つの引数が、わずか1存在。これは私が得ているエラーです。 –

+0

私の悪いです。 'removeEventListener()'のように、少なくとも2つのパラメータを取るようです。だから、元のコードをそのまま使用することができます。 – AngularChef

+0

しかし、それは私の問題のための解決策を提供しませんでした!それを行うには4つの方法がありますか?私はこの問題のためにangularjsの解決策しか見つけ出していませんが、角度4ではありません。 –

1

HostListenerデコレータを使用してイベントリスナーをバインドできますが、これはホスト要素に対してのみ有効です。子要素のリスナーを追加および削除する場合は、Renderer2.listenメソッドを使用する必要があります。これは、イベントリスナーを削除する関数を返します。

@Component({ 
    template: '<div #sectionOne></div>' 
}) 
export class myComponent { 
    private _listeners = []; 

    @ViewChild('sectionOne') 
    public section: ElementRef<any>; 

    constructor(private _renderer: Renderer2) {} 

    ngAfterViewInit() { 
    this._listeners.push(
     this._renderer.listen(this.section.nativeElement, 'click', this.handler.bind(this)) 
    ); 
    } 

    ngOnDestroy() { 
    this._listeners.forEach(fn => fn()); 
    } 

    public handler() { 
    } 
} 

The useCapture parameter isn't supported by angular by now. For more information, see this issue .

+0

ここで重要なのはuseCaptureパラメータ。あなたの例にそれを加えてください。しかし、EventManagerPluginをオーバーライドしないようにしてください – yurzui

+0

はい受動的なイベントリスナーは現在角度でサポートされていません。私はメモを追加します。 – cyrix

関連する問題