将自定义组件指令绑定到 for 循环中的对象

Posted

技术标签:

【中文标题】将自定义组件指令绑定到 for 循环中的对象【英文标题】:Bind custom component directive to object in for loop 【发布时间】:2019-10-29 23:18:00 【问题描述】:

我试图在我的视图中循环遍历我在组件类的代码中创建的组件列表,然后使用指令在 html 中显示该组件。

如何将我的指令绑定到列表中的组件实例:

这是我在代码中创建子组件列表的父组件:

import  Component, OnInit  from '@angular/core';
import  IFile  from '../Interfaces/IFile';
import  MatFileComponent  from './mat-file.component';

@Component(
  selector: 'mat-file-upload',
  templateUrl: './mat-file-upload.component.html',
  styleUrls: ['./mat-file-upload.component.css']
)
export class MatFileUploadComponent implements OnInit 
  constructor()  
  fileList: IFile[]
  addFilesToList(files: File[]): void 
    this.fileList = [];
    for (let file of files) 
      let fileComponent = new MatFileComponent()
      fileComponent.fileData = file;
      fileComponent.fileDescription = 'this is my cool description';
      fileComponent.fileName = file.name;
      fileComponent.fileType = file.type;
      this.fileList.push(fileComponent);
    
    console.log(this.fileList);
  
  ngOnInit() 
  

这是该组件的 html 模板,我正在努力弄清楚如何绑定我的子组件的实际实例:

<input type="file" #file multiple id="singleFile" (change)="addFilesToList(file.files)" />
<div *ngIf="fileList && fileList.length">
  <mat-file *ngFor="let file of fileList" [howDoIBindThisTo]="file"></mat-file>
</div>

这是我的个人文件组件:

import  Component, OnInit  from '@angular/core';
import  IFile  from '../Interfaces/IFile';

@Component(
  selector: 'mat-file',
  templateUrl: './mat-file.component.html',
  styleUrls: ['./mat-file.component.css']
)
export class MatFileComponent implements OnInit, IFile 
  public fileName: string;
  public fileDescription: string;
  public fileData: File;
  public fileType: string;
  componentLoaded: boolean = false

  constructor() 

  ngOnInit() 
    this.componentLoaded = true;
  

这是对应的 HTML 模板:

<div *ngIf="componentLoaded">
   fileType  that's the type, here's the desc fileDescription and name fileName
</div>

【问题讨论】:

【参考方案1】:

你可以为你的组件创建四个输入参数

export class MatFileComponent implements OnInit, IFile 
  @Input() public fileName: string;
  @Input() public fileDescription: string;
  @Input() public fileData: File;
  @Input() public fileType: string;
  componentLoaded: boolean = false

  constructor() 

  ngOnInit() 
    this.componentLoaded = true;
  

现在使用以下方式绑定它:

<div *ngIf="fileList && fileList.length">
  <mat-file *ngFor="let file of fileList" 
     [fileName]="file.fileName"
     [fileDescription]="file.fileDescription"
     [fileData]="file.fileData"
     [fileType]="file.fileType"
  ></mat-file>
</div>

【讨论】:

以上是关于将自定义组件指令绑定到 for 循环中的对象的主要内容,如果未能解决你的问题,请参考以下文章

将自定义可序列化对象绑定到控件,以便用户和加载/保存首选项

将自定义属性添加到 asp.net-mvc 中的页面指令

将自定义道具传递给 TypeScript 中的 Redux 表单字段

微信小程序将自定义组件获取的值传递给页面

微信小程序将自定义组件获取的值传递给页面

将自定义组件小部件动态添加到 Android 中的布局中