2016-05-12 4 views
0

評価があり、それはpostgresデータベースから取得され、テーブルに表示されます。 レーティングを編集するとき、私は "TagInputComponent"から来るような入力のような要素を通して、レーティングを追加または削除することしかできません。配列の初期状態のコピーを作成する方法は?

TagInputComponentは次のようになります。

import { Component, DoCheck, IterableDiffers, OnInit, Input, Output } from 'angular2/core'; 
import * as _ from 'underscore'; 

@Component({ 
    selector: 'taginput', 
    templateUrl: 'app/shared/taginput.component.html', 
    styleUrls: ['assets/stylesheets/taginput.css'] 
}) 
export class TagInputComponent implements OnInit, DoCheck { 
@Input() tags: string[]; 
newTag = ''; 
oldTags: string[]; 
differ: any; 

constructor(differs: IterableDiffers) { 
    this.differ = differs.find([]).create(null); 
} 

ngOnInit() { } 

ngDoCheck() { 
    var changes = this.differ.diff(this.tags); 

    if (changes) { 
     changes.forEachAddedItem(r => console.log('added ' + r.item)); 
     changes.forEachRemovedItem(r => console.log('removed ' + r.item)); 
    } 
} 

それは、このようDataFormComponenetに使用されます:それはデータで満たされると

<taginput [tags]="datapoint.tags"></taginput> 

にはどうすればoldTagstagsのコピーを作成するのですか?

これは、サービスからのデータがまだないため、ngOnInit()が早すぎることに気付きました。 ngDoCheck()では常にcurrentStateに更新されます。

これは簡単な作業のようですが、どうやってそれを行うか分かりません。


igorzg答えは私のために働いていましたが、私はそれを自分のニーズに変更しました。これは私がやったことです:

ngDoCheck() { 
    var changes = this.differ.diff(this.tags); 

    if (changes) { 
     if (Array.isArray(changes.collection) && !this.oldTags) { 
      this.oldTags = changes.collection.slice(); 
     } 

     changes.forEachAddedItem(r => console.log('added ' + r.item)); 
     changes.forEachRemovedItem(r => console.log('removed ' + r.item)); 
    } 
} 

答えて

3
ngOnChanges(changes) { 
    if (Array.isArray(changes.tags) && !this.oldTags) { 
    this.oldTags = changes.tags.slice(); 
    } 
} 
1

セッターはどうですか?

@Input() 
set tags(tags: string[]) { 
    this.oldTags = tags.slice(); 
    _tags = tags; 
} 
関連する問題