【问题标题】:Angular 13, animate a clicked element while leveraging a single animation blockAngular 13,在利用单个动画块的同时为单击的元素设置动画
【发布时间】:2022-01-05 22:12:11
【问题描述】:

我正在创建一个简单的单页网站(主要是为了学习 Angular),但似乎无法弄清楚如何使用单个动画来影响不同的 DOM 元素。我可以为每个元素定义动画,但这似乎非常无效。

有没有一种方法可以在单击的按钮内为图像设置动画,而无需为每个元素定义单独的动画块?

谢谢你, 特里

<!-- HTML:   -->  
<button mat-flat-button (click)="finishedChore()">
      <img
        [@openClose]="isOpen ? 'open' : 'closed'"
        src="assets/images/morning.png"
      />
    </button>
    <button mat-flat-button (click)="finishedChore()">
      <img
        [@openClose]="isOpen ? 'open' : 'closed'"
        src="assets/images/poop.png"
      />
    </button>
    <button mat-flat-button (click)="finishedChore()">
      <img
        [@openClose]="isOpen ? 'open' : 'closed'"
        src="assets/images/cleanRoom.png"
      />
    </button>
    <button mat-flat-button (click)="finishedChore()">
      <img
        [@openClose]="isOpen ? 'open' : 'closed'"
        src="assets/images/cleanSinks.png"
      />
    </button>
    <button mat-flat-button (click)="finishedChore()">
      <img
        [@openClose]="isOpen ? 'open' : 'closed'"
        src="assets/images/evening.png"
      />
    </button>
// .ts file
import { Component, OnInit } from '@angular/core';
import {
  trigger,
  state,
  style,
  animate,
  transition,
} from '@angular/animations';

@Component({
  selector: 'app-chore-list',
  templateUrl: './chore-list.component.html',
  styleUrls: ['./chore-list.component.scss'],
  animations: [
    trigger('openClose', [
      state('closed', style({ backgroundColor: '' })),
      state('open', style({ backgroundColor: 'blue' })),
      transition('closed<=>open', [animate('0.3s 0.0s ease-in')]),
    ]),
  ],
})
export class ChoreListComponent implements OnInit {
  isOpen = false;
  constructor() {}
  ngOnInit(): void {}

  finishedChore() {
    this.isOpen = !this.isOpen;

  }
}

【问题讨论】:

    标签: javascript angular typescript angular-animations angular13


    【解决方案1】:

    是的,可以使用单个动画块

    这里的问题是您使用单个 isOpen 变量和单个 finishedChore() 函数会影响此变量,因此当单击其中一个按钮时,所有按钮都会更改,因此我的建议如下所示

    <button mat-flat-button (click)="finishedChore('morning')">
      <img [@openClose]="ismorning" src="assets/images/morning.png" />
    </button>
    <button mat-flat-button (click)="finishedChore('poop')">
      <img [@openClose]="ispoop" src="assets/images/poop.png" />
    </button>
    <button mat-flat-button (click)="finishedChore('cleanRoom')">
      <img [@openClose]="iscleanRoom" src="assets/images/cleanRoom.png" />
    </button>
    <button mat-flat-button (click)="finishedChore('cleanSinks')">
      <img [@openClose]="iscleanSinks" src="assets/images/cleanSinks.png" />
    </button>
    <button mat-flat-button (click)="finishedChore('evening')">
      <img [@openClose]="isevening" src="assets/images/evening.png" />
    </button>
     
    

    .ts 文件

    import { Component, OnInit } from "@angular/core";
    import {
      trigger,
      state,
      style,
      animate,
      transition
    } from "@angular/animations";
    
    @Component({
      selector: "app-root",
      templateUrl: "./app.component.html",
    
      animations: [
        trigger("openClose", [
          state("false", style({ backgroundColor: "" })),
          state("true", style({ backgroundColor: "blue" })),
          transition("false<=>true", [animate("0.3s 0.0s ease-in")])
        ])
      ]
    })
    export class ChoreListComponent implements OnInit {
      //flower list can be done dynamically 
      isevening = false;
      iscleanSinks = false;
      ismorning = false;
      ispoop = false;
      iscleanRoom = false;
      flowerList = ["morning", "poop", "cleanSinks", "cleanRoom", "evening"];
    
      ngOnInit(): void {}
    
      finishedChore(flowerClicked) {
        this.flowerList.forEach((flowername) => {
          let varName = "is" + flowername; // assume this as "is"+'noop'=>isnoop
          console.log(varName);
          if (flowerClicked == flowername) {
            this[varName] = !this[varName];
          } else {
            this[varName] = false;
          }
        });
    
       
      }
    }
    
    
    
    
       
    

    【讨论】:

    • 感谢您的回复。我在变量的类型上有一些错误。你能帮我理解一下flowerList 的必要性吗?
    • 我只是将它们用于 for 循环,以帮助我决定点击哪一个,正如我在顶部提到的,这也可以通过另一种方式/动态完成
    • @TerryDunlap 你能把抛出的错误贴在这里吗?如果你改变了动画样式 state("false", style({ backgroundColor: "" })), state("true", style({ backgroundColor: "blue" })), transition("falsetrue", [animate("0.3s 0.0s ease-in")]) 检查这个codesandbox.io/s/tender-antonelli-mi9qn?file=/src/app/…
    • 我遇到了一些错误,其中一个是:在flowerClicked 上:参数'flowerClicked' 隐含地具有'any' 类型。第二个是this [varName]:元素隐式具有'any'类型,因为'string'类型的表达式不能用于索引'ChoreListComponent'类型
    • 我将其更改为使用 switch 语句,然后使用 this.ispoop = !this.ispoop 对每个案例进行编码。我正在尝试找到一种使其更具动态性的方法,因此,如果我更改了家务的名称或数量,代码仍然可以运行 switch (flowerClicked) { case 'ismorning': { this.ismorning = !this.ismorning;休息; }
    猜你喜欢
    • 2017-09-03
    • 2014-03-29
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    相关资源
    最近更新 更多