不変モデルオブジェクトの配列を使用しているときにCSSトランジションを実行できませんでした。角度:ngFor内の不変モデルのアニメーション
angleは、これらが機能するためにプロパティのインプレース更新が必要ですか、何か間違っていますか?一例として、
:ここでは( https://plnkr.co/edit/PBSPtk9vMig7cxnHoJqA)export class Box {
constructor(public selected:boolean){
}
}
function toggle(box:Box):Box{
return new Box(!box.selected)
}
@Component({
selector: 'my-app',
template: `
<ul>
<li *ngFor="let box of boxes">
<div
style="display:inline-block; width: 20px; height:20px; transition: 1s; margin:5px; cursor:pointer;"
[ngStyle]="{'background': box.selected?'green':'red'}"
> </div>
<button (click)="toggle_in_place(box)">toggle (in-place)</button>
<button (click)="toggle_replace_box(box)">toggle (replace box)</button>
<button (click)="toggle_replace_array(box)">toggle (replace array)</button>
</li>
</ul>
`,
})
export class App {
boxes: Box[];
constructor() {
this.boxes = [new Box(true), new Box(false), new Box(true)];
}
toggle_in_place(box:Box){
box.selected=!box.selected;
}
toggle_replace_box(box:Box){
const index = this.boxes.indexOf(box);
this.boxes[index]=toggle(box);
}
toggle_replace_array(box:Box){
this.boxes = this.boxes.map(v=>v===box?toggle(v):v);
}
}
私はを通じてdiv要素の色をアニメーション化しようとしている
[ngStyle]="{'background': box.selected?'green':'red'}"
によって更新することができますbox.selected:
- プロパティをインプレースで変更する(toggle_in_place)、
- 'ボックス'モデル(toggle_replace_box)を置き換えます。
- アレイ全体(toggle_replace_array)を置き換えます。
しかし、toggle_in_placeは目に見える遷移につながる唯一のものです。
これはちょうど私が住んでいなければならないものですか?
遷移shouldn」をボックスインスタンスについて気にすると、結果として生じるDOM変更だけが表示されます。 何が起こっているのかは、スタイルを更新するのではなく、何らかの理由でdivインスタンス全体が置き換えられるというボックスインスタンスの変更だと仮定します。 おそらくそれがngForの内部にあるからでしょうか? – Murray
あなたはその権利を持っています。 Angularは、新しいボックスが返されてから既存のものを更新するのではなく、新しいインスタンスでDOMを再構築しています。 – Adam