【问题标题】:How can I get the value/content of a custom component inside mat-table?如何在 mat-table 中获取自定义组件的值/内容?
【发布时间】:2019-05-27 05:34:40
【问题描述】:

我想用 mat-table 构建一个自定义表,其中最后一列和每一行我想定义一个自定义组件。这行得通。但是自定义组件是用于一些输入的,所以用户可以选择一些选项或输入一些东西。

<mat-table class="mat-elevation-z8" #table [dataSource]='dataSource'>

<ng-container matColumnDef='value'>
      <mat-header-cell *matHeaderCellDef>Values</mat-header-cell>
      <mat-cell *matCellDef='let row'>
          <app-dropdown-element #drop *ngIf="row.value == 'dropdown'" [options$]='row.$options'></app-dropdown-element>  

          <app-input-element #text *ngIf="row.value == 'text'" [title]=''></app-input-element>

          <app-input-number-element #num *ngIf="row.value == 'number'" [number$]='row.$number'></app-input-number-element>

      </mat-cell>
    </ng-container>
</mat-table>

这就是我在表格外加载组件时得到的结果

'selected' value is also correct:
DropdownElementComponent {options$: {…}, selected: "TEST"}
options$: {label: "TEST", options: Array(2), id: "oil-type"}
selected: "TEST"
__proto__: Object

但是在表格里面,我得到一个'undefined'

【问题讨论】:

  • 有机会分享一个stackblitz吗?我没有立即看到任何错误,所以如果我也能看到所有周围的代码会更容易。
  • @Jesse Here 是链接
  • 我在任何地方都没有看到undefined。 stackblitz 看起来一切正常。你能提供更多背景信息吗?
  • 只需检查控制台,如果您选择表格内的某些内容并单击按钮,您将看到它

标签: angular angular-material angular-material-7 angular-material-table


【解决方案1】:

感谢堆栈闪电战。

您实际上触及了 Angular 框架的一个非常有趣的怪癖……查看this 文章以获取有关它的详细信息,但基本上,模板引用变量只能在其自己的模板中访问。当我们添加*ngIf(或任何与此相关的结构指令,包括*matCellDef)时,Angular 最终会创建一个新的&lt;ng-template&gt;,使任何模板引用变量只能在该模板中访问。

因此,当您尝试在 * 指令之外引用“drop”时,它会显示为未定义。

【讨论】:

  • 谢谢!我现在明白了我的问题,但是有什么方法可以通过与选择组件以及包含表和选择组件的组件进行通信的服务来获取所选值?
  • 我会研究 FormArrays。此外,如果您想正确执行此操作,请在您的自定义组件上实现 ControlValueAccessor。我知道这些都不是简单的解决方案,但你未来的自己会感谢你。也就是说...如果您正在寻找更简单的方法,只需使用 @ViewChildren 装饰器在组件模板中将 AppDropDown 元素作为 ViewChildren 获取。
猜你喜欢
  • 1970-01-01
  • 2022-12-11
  • 2018-07-08
  • 1970-01-01
  • 2019-04-05
  • 2019-09-06
  • 2014-09-04
  • 2019-05-01
  • 2020-11-07
相关资源
最近更新 更多