[我一直在尝试为* ngIf设置动画,但是我注意到它仅在首页加载或刷新时设置动画

问题描述 投票:0回答:2

我基本上是从父组件(专辑组件)路由到musicList组件。 musicList组件获取存储在已激活路由器中的音乐数据,该数据可以通过解析器服务简单地对其进行解析(尽管我曾尝试直接调用它,但仍然存在动画问题)。

使用* ngIf的模板会在每次调用路由器上的各种ID时添加和删除每个音乐数据,但只会在加载页面或刷新页面时设置动画。为什么会这样呢?

<h2>My Album</h2>
<ul class="crisisAlbum">
  <li *ngFor= "let crisisMusic of crisisAlbum" [class.selected]="crisisMusic === selectedCrisisMusic" (click)="onSelect(crisisMusic)"><a [routerLink]="['/crisis-center', crisisMusic.id]">
    <span class="badge">{{crisisMusic.id}}</span>{{crisisMusic.music}}</a>
  </li>
</ul>
<router-outlet ></router-outlet>
<app-message></app-message>

将我带到子组件(音乐列表组件)<Template>

<div class="g" @slide *ngIf="crisisMusic" >
  <div >
  <h2> {{crisisMusic.music | uppercase}} Details</h2>
  <div><span>id: </span>{{crisisMusic.id}}</div>
  <div >
    <label>name:
      <input [(ngModel)]="crisisMusic.music" #crisisSong placeholder="name" />
    </label>
  </div>
  <button (click)="save(crisisSong)">Save</button>
  <button (click)="back()">Back</button>
</div>
</div>

<Component>

import { Component, OnInit, Input } from '@angular/core';
import { Observable } from 'rxjs'
// import {music} from '../musicInterface'
// import { MusicService } from '../music.service';
import { crisis } from '../crisis'
import { ActivatedRoute, Router, Params } from '@angular/router';
import { switchMap, timeout, map } from 'rxjs/operators';
import { CrisisService } from '../crisis.service';
import { DialogService } from 'src/app/dialog.service';
import { trigger, query, state, style, transition, animate, stagger } from '@angular/animations';

@Component({
  selector: 'app-music-list',
  templateUrl: './music-list.component.html',
  styleUrls: ['./music-list.component.css'],
  animations: [
    trigger('slide', [
      transition(':enter', [
        style({transform: 'translateX(100%)', opacity: 0, zIndex:100}),
        animate('500ms')
      ]),
      transition(':leave', [
        style({transform: '*', opacity: '*', zIndex:100}),
        animate('1000ms',style({transform:'translateX(100%)',zIndex:200, opacity:0}))
      ])
    ]
    )]
})
export class crisisMusicListComponent implements OnInit {
  @Input() animat: boolean;
  show:boolean= false;
  // @Input() crisisMusic:crisis
  public crisisMusic: crisis;
  private crisisId: number;
  public crisisSong

  constructor(private crisisMusicService: CrisisService, public dialogService: DialogService, private route: ActivatedRoute, private router: Router) {

  }
  isShow(){
    console.log('yes')
    this.show= !this.show
  }


  ngOnInit() {
    this.route.data
      .subscribe((data: { crisis: crisis }) => {
        this.crisisId = data.crisis.id
        this.crisisMusic = data.crisis;
        this.crisisSong= data.crisis.music
        console.log(data.crisis)
      });

  }
  back() {
    this.router.navigate(['../', { id: this.crisisId, foo: 'foo' }], { relativeTo: this.route })
  }
  save() {

    this.crisisSong = this.crisisMusic.music;
    console.log(this.crisisSong)
    this.router.navigate(['../', { id: this.crisisId, foo: 'foo' }])
  }
  canDeactivate(): Observable<boolean> | boolean {
    // Allow synchronous navigation (`true`) if no crisis or the crisis is unchanged
    if (!this.crisisMusic || this.crisisMusic.music === this.crisisSong) {
      return true;


    }
    // Otherwise ask the user with the dialog service and return its
    // observable which resolves to true or false when the user decides
    this.dialogService.confirm('Discard changes?').subscribe(d=>{
      if(d){
        this.save();
        // this.router.navigate(['/crisis-center',this.route.snapshot.paramMap.get('id')])
      }
    });
  }

}

请注意,数据是从解析器服务获取的。

我希望元素能够在每次触发* ngIf时动画化,以删除和添加新专辑。

angular angular-animations
2个回答
0
投票

此转换将在进入或离开时发生。这意味着在这种情况下,当ngIf中的条件改变时。由于它只能评估为真或假,因此只有在crisisMusic从未定义变为定义的内容或相反的情况下才可以更改。默认情况下,它是未定义的,并且当第一组数据通过路由到达时,将对其进行定义。那是动画唯一发生的地方。因此,您需要将ngIf或动画绑定到某种不同的条件,该条件会真正检查是否刚刚添加或删除了此元素。


0
投票

将动画放在路由上:

<router-outlet @slide></router-outlet>
© www.soinside.com 2019 - 2024. All rights reserved.