2017-01-25 10 views
0

私のangular2ウェブサイトからCSVファイルをダウンロードします。このために私はjsonファイルからデータを取得します。パラメータdownloadとhrefが設定されたら、クリックをシミュレートしてダウンロードを開始したいと思います。Angular2:イベントターゲットをクリックすると、無限ループが発生します

ただし、このクリックにより無限ループのダウンロードが発生します... この問題を解決して1つのファイルしかダウンロードできないのはなぜですか?

ここに私のcomponent.htmlコード:

<div> 
    <a class="csv-template" (click)="downloadCSVTemplate($event)">Dowload File</a> 
</div> 

マイcomponent.tsコード:

downloadCSVTemplate(event) { 
let locale = this.navContextSrvc.locale; 

this.http 
    .get('assets/csv/template_'+ locale +'.json') 
    .subscribe(res => { 
     event.target.download = 'template_'+ locale +'.csv'; 
     event.target.href = 'data:text/csv;charset=utf-8,' 
     + encodeURIComponent(res._body); 
     event.stopPropagation(); 
     event.target.click(); // causes infinite loop of download 
     event.preventDefault(); 
    }); 
} 
+1

:これにより は、ダウンロードはここに私のchangements後にコードを

を立ち上げています。クリックするたびに '' downloadCSVTemplate'''を呼び出すと、この関数は '' '' ''を起動します。 –

+2

クリックハンドラを持って自分自身から別のクリックを送ると、どうなるでしょうか?基本的に、終了条件なしで自分自身を呼び出す関数を書いています。それはあなたが排除する必要がある明らかな無限ループです。 –

+0

マークアップに適切な属性を割り当てないのはなぜですか? – Aer0

答えて

0

問題は私の非同期呼び出しでした。 href属性が変更される前にダウンロードが開始されました。

しかし、私はクライアントからファイルをダウンロードすることを選択したので、私は非同期呼び出しを渡さずにファイルを呼び出します。あなたは再帰関数を呼び出している原因

downloadCSVTemplate(event) { 
    let locale = this.navContextSrvc.locale; 
    event.target.download = 'template_'+ locale +'.csv'; 
    event.target.href = 'assets/csv/template_'+ locale +'.csv'; 
} 
0

この:

event.target.click(); // causes infinite loop of download

の「無限ループが発生することはありません。ダウンロード "を実行すると、downloadCSVTemplateを呼び出して無限ループを引き起こします オーバー。

click()をもう一度呼び出すと、何をしようとしているのか不明です。

関連する問題