更新: Angular では DOM を操作できないことを読みました。その場合、何をすべきか、ベストプラクティスは何ですか? タイムアウト、NgZone、ChangeDetectionStrategy.OnPush、ChangeDetectorRef detectChanges() をすべて使用してみましたが、すべて成功しませんでした。
私はhtmlのimg要素を持っています:
<img class="selected" id="icon-image-{{item.id}}" src="{{item.icon}}" height="75" width="75" />
およびいくつかのsccs :
img.selected {
-webkit-filter: grayscale(100%); /* Chrome, Safari, Opera */
filter: grayscale(100%);
}
これが読み込まれると、選択したクラスが適用され、期待どおりに画像が灰色になります。
ただし、次のtypescrptを実行すると、画像はグレーのままになります。
let imgEl: HTMLElement = document.getElementById('icon-image-' + subCategoryModel.id);
imgEl.className = "";
className をログに記録すると、選択されたものが前にあり、後に削除されたことが示されます。
console.log(imgEl.classList);
className を削除してもスタイルが反映されない理由はありますか?
ソースコードを見ると、DOM の更新ではなく、imgEl.classList が変更されています。なぜなのかご存知ですか?
ありがとう
アップデート:
奇妙なことに、DOM の className を手動で (たとえば、Firebug で) 変更すると、変更が反映されます。ただし、画像をクリックするとすぐに、元の値に更新されます。あたかもDOMがリフレッシュされているかのようです。
この場合、DOM を動的に更新するにはどうすればよいでしょうか? DOM の更新はすべての変更を上書きするだけだからです。
HTML
<ion-row *ngFor="let trio of getTriples()">
<ion-col *ngFor="let item of trio" (click)="itemTapped(item)">
<center>
<div class="row responsive-md">
<img class="selected" id="icon-image-{{item.id}}" src="{{item.icon}}" height="75" width="75" />
</div>
</center>
</ion-col>
</ion-row>
タイプスクリプト
itemTapped(subCategoryModel: SubCategoryModel) {
let idx: number = this.isInArray(this.employeeModel.subCategories, subCategoryModel);
let imgEl: HTMLElement = document.getElementById('icon-image-' + subCategoryModel.id);
if (idx >= 0) {
this.employeeModel.subCategories.splice(idx, 1);
imgEl.setAttribute("class", "");
} else {
this.employeeModel.subCategories.push(subCategoryModel);
imgEl.setAttribute("class", "selected");
}
console.log('icon-image-'+subCategoryModel.id+' ('+imgEl.id+'): ' + document.getElementById('icon-image-' + subCategoryModel.id).className);
}