2017-01-12 13 views
3

私はオブジェクトの静的配列を繰り返し処理し、内容を表示する単純なコンポーネントを持っています。このコンポーネントを大きなアプリケーションに追加すると、コンテンツが正しく表示されますが、クリックイベントを登録できません。 right click -> Inspectを使用してクロムの要素を検査すると、bodyタグで挨拶され、期待どおり個々の要素にドリルダウンしません。静的な配列のオブジェクトで* ngForを反復処理すると、DOMは常に更新されます

手動でナビゲートすると、要素を調べると、コンポーネントがDOMによって常に更新されていることがわかります(divタグが点滅します)。私の理解では、静的配列なので変更が検出されるべきではありません。

オブジェクト配列を単純な文字列配列に変更すると、['a', 'b', 'c']は正常に動作し、DOMは更新されません。

追加の要素を追加すると、ngFor以外のテンプレートは影響を受けず、常に更新されません。

私はV2.4.1

簡体コンポーネント

import { Component } from '@angular/core'; 
 

 
@Component({ 
 
\t selector: 'app-ngfor-test', 
 
\t templateUrl: './ngfor-test.component.html', 
 
\t styleUrls: ['./ngfor-test.component.css'] 
 
}) 
 
export class NgforTestComponent { 
 
\t 
 
\t get items() { 
 
\t \t return [ 
 
\t \t \t { 
 
\t \t \t \t 'label': 'a', 
 
\t \t \t \t 'value': 'first' 
 
\t \t \t }, 
 
\t \t \t { 
 
\t \t \t \t 'label': 'b', 
 
\t \t \t \t 'value': 'second' 
 
\t \t \t }, 
 
\t \t \t { 
 
\t \t \t \t 'label': 'c', 
 
\t \t \t \t 'value': 'third' 
 
\t \t \t } 
 
\t \t ]; 
 
\t } 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

テンプレート

<div class="item-container" *ngFor="let item of items"> 
 
\t <label>{{ item.label | uppercase }}</label> 
 
\t <span>{{ item.value }}</span> 
 
</div>
を使用しています

答えて

1

@seidmeが述べたように、変更検出が実行されるたびにgetterが呼び出されるため、頻繁に行うことができます。

get items() { 
    return [ 
     { 
      'label': 'a', 
      'value': 'first' 
     }, 
     { 
      'label': 'b', 
      'value': 'second' 
     }, 
     { 
      'label': 'c', 
      'value': 'third' 
     } 
    ]; 
} 

ngForが再レンダリングリストに原因となる、それが呼び出されるたびに新しいオブジェクトインスタンスを返します。角度は、それが同じオブジェクトのインスタンスを持って、何も変わっていないと何も更新または再レンダリングする必要はありません認識するため

あなたは、

items = [ 
     { 
      'label': 'a', 
      'value': 'first' 
     }, 
     { 
      'label': 'b', 
      'value': 'second' 
     }, 
     { 
      'label': 'c', 
      'value': 'third' 
     } 
    ]; 

get items() { 
    return this.items; 
} 

それが再レンダリングを停止しますし、それを変更した場合。

+0

ありがとう。これは、オブジェクト配列が文字列配列と異なる動作をする理由を理解するのに役立ちます。私はgetterを使用しています。なぜなら、私はサーバから取得したrepsonseに基づいてコンテンツを動的に表示したいからです。 –

+0

サーバからの応答が到着したときでも 'this.items'を更新することはできますが、実際に変更されたときだけ変更(再レンダリング)されます。 –

+0

助けてくれてありがとう、私はセッターを利用して動的な価値を達成した –

2

getter*ngForに設定しています。 getシンタックスはオブジェクトプロパティを、そのプロパティがルックアップされるときに呼び出される関数にバインドします(Angularが変更検出を実行するたびに)、常に新しい配列オブジェクトを返します(参照の変更)。リスト。

+0

ありがとう、私はそれかもしれないと思ったが、これはオブジェクト配列が文字列配列に置き換えられたときに期待どおりに動作する理由を説明していない –

関連する問題