【问题标题】:When clicked on a Component, pass the Component itself as a parameter单击组件时,将组件本身作为参数传递
【发布时间】:2021-09-01 01:24:57
【问题描述】:

组件是通过ngFor 生成的。同一个 click 事件处理程序绑定到所有这些。我想捕获用户在事件处理程序中单击的Component 作为参数。

模板

<div>
  <app-my-component (click)="pageClicked(<sender>)" *ngFor="let page of pages"></app-my-component>
</div>

代码背后

pageClicked(sender: MyComponent): void {
  // sender would be the COMPONENT who called this function.
}

我已经尝试过的

  • 通过将组件命名为 #comp 来使组件成为模板变量,我得到了一个空对象
  • 使用this 关键字,this 在此上下文中是父组件,通过 ngFor 生成较小的组件
  • 发送$event作为参数并通过path查找组件,我不想要html元素,我想要整个组件并访问它的公共变量和方法

最终在捕获组件后,我想将它的 [selected] Input 设置为 true 并清除最后选择的组件,如果我只能获取组件并将其存储在局部变量中,这应该不难.

【问题讨论】:

    标签: angular typescript components sender


    【解决方案1】:

    如果您使用模板引用变量,则传递整个组件,

    <app-my-component #component (click)="pageClicked(component)"..>
    

    如果你有一个@OputPut,在发射器时使用它,但将事件重命名为(click),使用例如(onClick)

    //your component
    @Output()onClick:EventEmitter<MyComponent>=new EventEmitter<MyComponent>()
    
    clickButton(){
       this.onClick.emit(this)
    }
    

    查看fool stackbliz

    【讨论】:

      【解决方案2】:

      模板参考变量

      <div>
        <app-my-component #mycomponent (click)="pageClicked(mycomponent)" *ngFor="let page of pages"></app-my-component>
      </div>
      
      pageClicked(sender: MyComponent): void {
        // sender.selected is now available
      }
      

      不重要

      我一开始尝试了这个,但是得到了一个空对象,猜想项目还没有建成......

      我将把它留在这里供以后参考和问同样问题的人。

      【讨论】:

        【解决方案3】:

        不妨试试:

        <ng-container *ngFor="let page of pages">
            <app-my-component #component (click)="pageClicked(component)"
            </app-my-component>
        </ng-container>
        

        【讨论】:

        • 是的,使用template reference variable 是解决方案,我一开始尝试了这个,但我猜当我测试它时项目还没有构建。谢谢你的回答; )
        猜你喜欢
        • 2019-01-03
        • 1970-01-01
        • 2017-10-10
        • 2023-04-03
        • 1970-01-01
        • 2019-06-08
        • 1970-01-01
        • 2020-10-06
        • 2017-05-15
        相关资源
        最近更新 更多