访问组件内的模板变量

Iva*_*van 5 javascript typescript angular angular5

我遇到了 ng-template 的问题。

我们通过 ngTemplateOutletContext 在表格组件中传递一些参数,如下所示。我们根据其中包含的数据类型为单元格使用不同的渲染器。注意 cellvalue 参数,因为它是我需要的。

<ng-container *ngIf="useCellRenderer(column, row)">
   <ng-template [ngTemplateOutlet]="column.renderer.templateref" [ngTemplateOutletContext]="{ cellvalue: row[column.attr], rowvalue:row }">
   </ng-template>
</ng-container>
Run Code Online (Sandbox Code Playgroud)

负责渲染的组件的模板如下所示:

<ng-template #templateRef let-cellvalue="cellvalue" let-rowvalue="rowvalue">
  {{ getTraslateValue(cellvalue)}}
</ng-template>
Run Code Online (Sandbox Code Playgroud)

该模板能够访问 cellvalue 参数并正确调用该函数,但是我想从组件的 TS 访问相同的参数并且似乎无法做到这一点。

到目前为止我尝试过的内容与以下代码段一致

@ViewChild('templateRef', { read: TemplateRef })
  public templateref: TemplateRef<any>;

  ngAfterViewInit() {
    console.log('ngAfterViewInit', this.templateref.elementRef);
  }
Run Code Online (Sandbox Code Playgroud)

但是在console.log中找不到cellvalue

提前致谢!

Iva*_*van 4

所以@SebOlens 用他所说的指导我找到了解决方案。我结束了使用 exportAs 创建指令。该指令如下:

TS

@Directive({ selector: '[exposeVariable]', exportAs: 'exposed' })
export class ExposeVariableDirective {
  @Input() variablesToExpose: any;
  }
}
Run Code Online (Sandbox Code Playgroud)

它可以通过以下方式在模板中使用,例如:

超文本标记语言

<ng-template #templateRef let-cellvalue="cellvalue" let-rowvalue="rowvalue">
  <div exposeVariable [variablesToExpose]="{cellValue: cellvalue}" #exposedRef="exposed">
    {{ getTraslateValue(cellvalue)}}
  </div>
</ng-template>
Run Code Online (Sandbox Code Playgroud)

并且可以从组件访问单元格值:

TS

@ViewChild('exposedRef') public directiveExposed: any;
Run Code Online (Sandbox Code Playgroud)

在我的例子中,指令在AfterViewInit组件之后初始化,因此,如果您尝试初始化某些内容,则必须观察变量的值ViewChild,或者在我的例子中,我使用ngIf模板中的一个和一个公开变量激活了一个组件这样我就可以使用新组件中的钩子。

再次感谢@SebOlens:)