8
A
回答
12
它有幾個問題,因爲ngFor
做了一些冗餘添加/刪除引起進行動畫處理的項目,其不應該:
import {Component} from 'angular2/core';
import { Component, Directive, OnDestroy, Input } from 'angular2/core';
@Component({
selector: 'my-app',
template: `<div (click)="$event.preventDefault()">
<button type="button" (click)="pushItem()">Push</button>
<button type="button" (click)="removeItemLast()">Remove Last</button><br/>
<button type="button" (click)="unshiftItem()">Unshift</button>
<button type="button" (click)="removeItemFirst()">Remove First</button><br/>
<ul>
<li class="my-animation" *ngFor="#item of items">
{{item.title}}
</li>
</ul>
</div>`
})
export class AppComponent {
private count:number = 1;
public items: Array<any>;
constructor() {
console.clear();
this.items = [];
this.items.push(this.newItem());
this.items.push(this.newItem());
}
pushItem() {
this.items.push(this.newItem());
},
removeItemLast() {
if(this.items.length > 0) this.items.splice(this.items.length - 1, 1);
},
unshiftItem() {
this.items.unshift(this.newItem());
},
removeItemFirst() {
if(this.items.length > 0) this.items.splice(0, 1);
},
newItem() {
return {title: 'Item' + this.count++};
}
}
@keyframes MyAnimation {
0% {
padding-left: 100px;
}
100% {
padding-left: 0px;
}
}
.my-animation {
animation: MyAnimation 1s;
}
Plunker example (RC.x)從https://github.com/angular/angular/issues/7239演示問題。
更新
這被固定在很久以前
5
有現在guide to Angular's animation system。如果我們想要做一些奇特的事情,這會有所幫助,比如在組件初始化之後添加的元素的動畫,而不是已經存在的元素。我已經修改了以前的答案,以Angular 2的方式進行操作。
Plunker:http://plnkr.co/edit/NAs05FiAVTlUjDOZfEsF?p=preview
import {
Component,
trigger, transition, animate, style, state
} from '@angular/core';
@Component({
selector : 'my-app',
animations: [
trigger('growShrinkStaticStart', [
state('in', style({ height: '*', 'padding-top': '*', 'padding-bottom': '*', 'margin-top': '*', 'margin-bottom': '*' })),
transition('* => void', [
style({ height: '*', 'padding-top': '*', 'padding-bottom': '*', 'margin-top': '*', 'margin-bottom': '*' }),
animate("0.5s ease", style({ height: '0', 'padding-top': '0', 'padding-bottom': '0', 'margin-top': '0', 'margin-bottom': '0' }))
]),
transition('void => false', [
/*no transition on first load*/
]),
transition('void => *', [
style({ height: '0', 'padding-top': '0', 'padding-bottom': '0', 'margin-top': '0', 'margin-bottom': '0' }),
animate("0.5s ease", style({ height: '*', 'padding-top': '*', 'padding-bottom': '*', 'margin-top': '*', 'margin-bottom': '*' }))
])
])
],
template : `<div (click)="$event.preventDefault()">
<button type="button" (click)="pushItem()">Push</button>
<button type="button" (click)="removeItemLast()">Remove Last</button><br/>
<button type="button" (click)="unshiftItem()">Unshift</button>
<button type="button" (click)="removeItemFirst()">Remove First</button><br/>
<ul style="background: light-blue">
<li *ngFor="let item of items"
[@growShrinkStaticStart]="animationInitialized.toString()"
(@growShrinkStaticStart.done)="animationInitialized = true"
style="background-color:pink; border:1px dashed gray; overflow:hidden">
<h3>{{item.title}}</h3><p>{{item.description}}</p>
</li>
</ul>
<div>Footer</div>
</div>`
})
export class AppComponent
{
private count: number = 1;
public items: Array <{ title: string, description: string }> ;
private animationInitialized: boolean = false;
constructor() {
this.items = [];
this.items.push(this.newItem());
this.items.push(this.newItem());
}
pushItem() {
this.items.push(this.newItem());
}
removeItemLast() {
if (this.items.length > 0)
this.items.splice(this.items.length - 1, 1);
}
unshiftItem() {
this.items.unshift(this.newItem());
}
removeItemFirst() {
if (this.items.length > 0)
this.items.splice(0, 1);
}
newItem() {
let d: string = "";
let possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz. ! ? ";
for (let i = 0; i < Math.floor(Math.random() * 50000); i++)
d += possible.charAt(Math.floor(Math.random() * possible.length));
return { title : 'Item' + this.count++, description: d };
}
}
相關問題
- 1. Angular 2:在* ngFor中動畫數據?
- 2. 如何在Angular 2中測試* ngFor?
- 3. Angular 2:* ngFor in * ngFor
- 4. 在ngFor-Angular 2中計數
- 5. Angular 4 ngFor
- 6. Angular:內部不可變模型的動畫ngFor
- 7. Angular 2中的Observable和ngFor
- 8. Angular 2 ngSwitch嵌套在ngFor
- 9. 在Angular APP上更新ngFor
- 10. Angular 2在離子2中的動畫
- 11. Angular 2 - 如何通過* ngFor函數
- 12. Angular(4):ngFor批量?
- 13. Angular 2 ngFor和ngIf
- 14. Angular2動畫 - 無法在ngFor循環上動畫組件
- 15. 在Angular 2中生成ngFor子元素
- 16. Angular - 在* ngForf中使用* ngFor對錶
- 17. 如何在Angular 4.0中設置量角器的* ngFor集合?
- 18. 如何使用ngFor在Angular中循環使用對象屬性
- 19. 如何在Angular中使用* ngFor設置formControlNames?
- 20. 如何在ngFor中綁定img src in angular 2?
- 21. 如何在[嵌套] ngFor(Angular rc2)中設置ngModel?
- 22. 如何在Angular 4中使用* ngFor迭代json對象屬性
- 23. 如何在Angular 2中使用ngFor迭代API數據
- 24. Angular 2:在ngFor中動態添加一個類
- 25. Angular 2 HTTP響應動畫
- 26. 在Angular(Angular 2/4)的* ngFor中動態應用格式化過濾器/管道?
- 27. 如何在數組中循環遍歷數組,只使用ngFor在angular 2中使用ngFor
- 28. Angular - ngFor性能問題
- 29. Angular 2 ngIf和ngFor組合
- 30. Angular 2:* ngFor指令列表
你會如何做沒有突變的陣列例如你會怎麼動畫插入或更新與可觀察到的<陣列> –
不知道,但我想它應該工作一樣。我假設'ngFor'檢查更改並只更新更改的內容。雖然沒有驗證。 –
@GünterZöchbauer任何想法如何擺脫redundent添加/刪除?我試圖添加一個trackby([plunker](http://plnkr.co/edit/OxNC4Nh3kCHKw185masi?p=preview))與一個唯一的ID,但它不起作用。不管怎麼說,還是要謝謝你! – maxbellec