ngAfterViewInit 仅单击数组中的第一个按钮。激活其他后续数组元素引用的结果

Posted

技术标签:

【中文标题】ngAfterViewInit 仅单击数组中的第一个按钮。激活其他后续数组元素引用的结果【英文标题】:ngAfterViewInit clicks only first button in array. Activates result of other subsequent array ElementRefs 【发布时间】:2019-12-19 14:29:08 【问题描述】:

从一个自定义组件中,我有一个 ElementRef 数组来显示附加到 *ngFor 循环中接收到的数据的图像。一旦点击事件发生,所有图片都显示在一张数据卡中,而另一张 *ngFor 数据卡则不显示任何图片。

我从父组件开始,然后是 customComponent,但结果相同。控制台向我显示每个 ElementRef 正确地有一个不同的图像,但只有第一个将所有图像捆绑在一起,而其余的卡是纯数据的。没有图片。


  @ViewChildren('clickBrag') bragwphoto: QueryList<ElementRef>;
ngAfterViewInit() 
      this.bragwphoto.changes.subscribe(() => 
        let array = this.bragwphoto.toArray();
        for (const a of array )
        
          a.nativeElement.click();
        
      );
    
<bragwphoto *ngFor="let brag of brags; let index = index"

                      [name]="brag.name"
                      [date]="brag.updatedAt"
                      [post]="brag.post"
                      [fileID]="brag.fileID"
                      [length]="brag.comments.length"
                      >

                      <div *ngIf="brag.fileID" #clickBrag (click)="getBinary(brag.bragPhoto.data.data)"> </div>

                </bragwphoto>

预期:

<customComponent>image, post,date...</customComponent>
<customComponent>image, post,date...</customComponent>
<customComponent>image, post,date...</customComponent>
etc...
Actual output is:
<customComponent>image,image,image, post,date...</customComponent>
<customComponent>post,date...</customComponent>
<customComponent>post,date...</customComponent>
etc...

【问题讨论】:

【参考方案1】:

已排序。 问题:getElementsById 将关注与您的查询匹配的第一个元素,并在那里转储所有照片。 因此,请重置第一个元素的 id,然后 appendChild 您的第一个图像。 立即,对 getElementsById 的下一次调用将带来一个新元素,它会经历相同的过程,循环直到您的数组耗尽。 瞧,所有图片都将放在适当的位置。

enter code here


ngAfterViewInit() 
      this.bragwphoto.changes.subscribe(() => 
        setTimeout(async () => 
       let bragPhotoButtons = this.clicker.toArray();
            for(var i = 0; i<bragPhotoButtons.length; i++) 
              bragPhotoButtons[i].nativeElement.click();
          
        )
      )
    

async getBinary(base64String: string, elem: any) 

      let photoSlot = 0;
        let img = new Image();
          img.src = "data:image/jpeg;base64," + this.arrayBuffer2Base64(base64String);
            const ringaID = await elem.ringaID;

            const src = document.getElementById("bragPhotoDiv");
            // let src = document.getElementById("bragPhotoDiv").setAttribute("id", photoSlot + "modified" + ringaID);

          src.id = photoSlot + "modified" + ringaID;
        photoSlot++;

      src.appendChild(img);
  

【讨论】:

以上是关于ngAfterViewInit 仅单击数组中的第一个按钮。激活其他后续数组元素引用的结果的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB - 仅获取已填充文档的数组中的第一项 - 例如user.populate('posts', 'images.0')

单击事件仅适用于表格 Angular 8 的第一页

可点击的行仅适用于数据表的第一页

onchange = "Form.submit() 仅适用于我的下拉菜单中的第一个子下拉菜单

仅存储多个用户生成值中的第一个的动态分配数组

在 ngAfterViewinit 上推送未定义的数组