使用不可变模型对象数组时,我无法使CSS转换工作。
角度是否需要对属性进行就地更新才能使这些更新,或者我做错了什么?
例如:(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是唯一一个导致可见转换的人。
这只是我必须忍受的事情吗?
答案 0 :(得分:1)
这里发生了什么:当数组更改时,ngFor将新数组中的对象引用与旧数组进行比较,并重新呈现已更改的任何元素,这会破坏css转换。
要解决此问题,可以为ngFor提供跟踪功能,然后使用该功能代替参考比较。
要修复,请指定跟踪函数以使用id而不是对象引用:
dev
有使用它:
master
答案 1 :(得分:0)
我认为这是你必须要忍受的。在后两种情况下,由于您每次都要创建一个新的盒子实例,因此无需转换。
你可能会制作一个基本上是盒子包装的组件,并且可以通过&#34;转换&#34;布尔值到它的构造函数。解决方法很大程度上取决于用例。