2017-09-16 19 views
3

ダイアログで作成されたコンポーネントインスタンスを破棄する適切な方法はありますか? iはdialog-コンポーネントインスタンスを近接して配置されていない。角材破棄ダイアログインスタンス

import { Component, OnInit, Input, Output, EventEmitter, Inject } from '@angular/core'; 
import { MdDialog, MdDialogRef, MD_DIALOG_DATA } from '@angular/material'; 

@Component({ 
    selector: 'basket', 
    templateUrl: './basket.component.html', 
    styleUrls: ['./basket.component.css'] 
}) 
export class BasketComponent implements OnInit { 
    @Input() Product: any; 
} 

@Component({ 
    selector: 'basket-dialog', 
    template: '<div><basket [Product]="Product"></basket></div>' 
}) 
export class BasketDialogComponent implements OnInit { 
    Product: any; 
    constructor(public dialogRef: MdDialogRef<BasketComponent>, 
     @Inject(MD_DIALOG_DATA) public productData: any) { } 


    ngOnInit() { 
     this.Product = this.productData; 
     this.say(); 
    } 

    say() { 
     setTimeout(() => this.say(), 1000); 
     console.log('test'); 
    } 
} 

ダイアログの作成:

let ordersDialog = this.dialog.open(BasketDialogComponent, { 
    data: product 
}); 
ordersDialog.afterClosed().subscribe(x => { 
    // something like: orderDialog.componentInstance.dispose(); 
}); 

say()方法はまだダイアログを閉じた後でも実行されています。

答えて

1

あなたは自分をsetTimeoutを配置気にする必要がありますPlunker Example

+0

はい、タイムアウトのある実際の実装は誤解を招きました。角度のついたダイアログが閉じられた直後にコンポーネントが破棄されます。私の場合は、コンポーネントが破棄されたときに、オブザーバブルからの登録を解除するだけでした。 – Brivvirs

0

export class BasketDialogComponent implements OnInit, OnDestroy { 

    timeoutId; 

    say() { 
    this.timeoutId = setTimeout(() => this.say(), 1000); 
    console.log('test'); 
    } 

    ngOnDestroy() { 
    if (this.timeoutId) { 
     clearTimeout(this.timeoutId); 
    } 
    } 
} 

私は近いこのような後に私のダイアログを配置します。開いたダイアログ参照をnullに設定するだけです。

let ordersDialog = this.dialog.open(BasketDialogComponent, { 
    data: product 
}); 
ordersDialog.afterClosed().subscribe(x => { 
    ordersDialog = null; 
}); 
+0

ここで試すことができますhttps://plnkr.co/edit/7Z3HCDJZFh4KEIG8gq9n?p=previewダイアログが閉じられた後もタイマーはまだ表示されています – yurzui

関連する問題