2017-01-01 10 views
1

シナリオ内の文字列(DOM)を経由してモデルを渡す方法:多くの文字列を持つことができます角度2

let many = []; 
let timer = 60; 
setInterval(() => timer--, 1000); 
many.push("this is a selection WITH a {{timer}}"); 
many.push("this is a selection WITHOUT a timer"); 

だから、基本的には、配列 "多く" のtheres:

<div *ngFor="let one of many"> 
    <span [innerHtml]="one"></span> 
</div> 

シナリオ(コントローラ)動的に作成されて作成され、 "多くの"文字列に渡された文字列の一部にはカウントダウンがあり、他の文字列にはカウントダウンがありません。上記のように文字列を介してDOMにモデルを渡し、タイマーを更新する方法はありますか?そして、その実現可能性がどのように達成できるか。

私は本当にこれは、 "gotchas" thats soooo明白なisntの1つです。

グラシアス

答えて

3

PLUNKER

これは「ハック」ソリューションのようなものですが、それは動作しますが、余分なコンポーネントを作成する必要はありません。

まず、これにテンプレートを変更します。

<div *ngFor="let one of many"> 
    {{one.replace('[timer]', timer)}} 
</div> 

第二に、クラス変数としてtimermanyを宣言:

export class YourComponent { 
    timer:number=60; 
    many:string[]; 

    (...) 
} 

最後に、含めたい時はいつでも、manyに新しい行を追加しますtimer{{timer}}の代わりに[timer]を使用してください。

[timer]を自由に変更することができます。

+0

timersの値は一度追加され、その後の更新でDOMを更新するためにAngulars Change Detectionが呼び出されることはありません。 – Cozzbie

+0

ああ、申し訳ありませんが、私は質問を正しく理解していなかったと思います。新しく追加された要素をDOMに適切に表示させる方法を尋ねられたと思いました。タイマーについての質問は?定期的にタイマーを実行する方法を知りたいですか?そうでない場合は、私があなたを助けることができるように明確にしてください。 – AArias

+0

はい、確かに質問はタイマーについてです、そして、はい、私は質問を適切にフレーミングしているようではないので、広く説明しましょう。私はそのタイマーを更新可能にしたいが、配列 "many"が他の文字列を受け取るので、コンポーネントやDOMで通常の方法で宣言したくない。出力は のようになります。「こんにちは私はタイマーです(60-59-58 .... 0)< - (これは "多数"に動的に渡されるカウントダウンタイマーです) こんにちは私たちはあなたを待っています。 < - ( "many"に動的に渡される文字列) こんにちは? < - (別の文字列が "many"に動的に渡されました) ' – Cozzbie