【问题标题】:How to wrap an Angular Component and pass ng-template from outer to inner component如何包装 Angular 组件并将 ng-template 从外部组件传递到内部组件
【发布时间】:2018-08-01 21:24:19
【问题描述】:

我正在使用 Angular 5 并尝试将 ng-select 包装在自定义组件中。 我的理由是封装它,以便在需要时可以轻松更换。 如果有更好的方法,请告诉我。

我创建了一个自定义组件,我有各种 @Inputs() 依次传递给内部 ng-select。这一切都很好。

我的问题是如何正确地将 ng-select custom templates 传递给包装好的 ng-select?

这是我到目前为止的一个示例,为简单起见,我省略了一些输入。

这就是我调用传入自定义模板的包装器的方式:

 <app-wrapper-select
    [items]="cars"
    [(selected)]="selectedCars">

    <ng-template #labelTemplate ng-label-tmp let-item="item">
      <span class="ng-value-label">LABEL {{item.metadata.name}}</span>
      <span class="ng-value-icon right" aria-hidden="true">×</span>
    </ng-template>

    <ng-template #optionTemplate ng-option-tmp let-item="item">
      <span class="ng-value-label">OPTION {{item.metadata.name}}</span>
      <span class="ng-value-icon right" aria-hidden="true">×</span>
    </ng-template>

  </app-wrapper-select>

在包装器组件中,我将模板声明如下:

@ContentChild('labelTemplate', { read: TemplateRef }) labelTemplate: TemplateRef<any>;
@ContentChild('optionTemplate', { read: TemplateRef }) optionTemplate: TemplateRef<any>;

这是包装组件 html:

<ng-select
  [items]="items"
  [(ngModel)]="selected">

  <ng-template ng-label-tmp let-item="item">
    <ng-container *ngTemplateOutlet="labelTemplate; context:{item: item}"></ng-container>
  </ng-template>

   <ng-template ng-option-tmp let-item="item">
    <ng-container *ngTemplateOutlet="optionTemplate; context:{item: item}"></ng-container>
  </ng-template>

</ng-select>

上面确实渲染了模板,但是标签和选项的所有样式都丢失了,只是在白色背景上显示为文本。

我一定是遗漏了一些东西,我怎样才能让样式正确呈现?

另一个问题是 ng-select 在每个标签上都有一个关闭按钮,可以将其从所选项目中删除,并有一个关联的 clear() 方法 - 但是当我在 ng-select 之外的模板中使用它时,它无法识别,例如

        <ng-template #labelTemplate ng-label-tmp let-item="item" let-clear="clear">
          <span class="ng-value-label">LABEL {{item.metadata.name}}</span>
          <span class="ng-value-icon right" (click)="clear(item)" aria-hidden="true">×</span>
        </ng-template>

如何在 ng-select 之外的 ng-template 中使用 clear(),有什么方法可以获取对它的引用并调用它?

谢谢。

【问题讨论】:

    标签: angular typescript ng-template ng-container


    【解决方案1】:

    好的,如果有人像我一样感到困惑,我可以在这里解决问题。在 IntelliJ 中,当模板输入变量是函数时,它无法识别它们并说它们不可调用。虽然它编译得很好。这也发生在 ngBootstrap 模态以及 close 和 dismiss 方法中。这是我使用的 ng-template,现在可以使用了

    <app-wrapper-select
        [items]="cars"
        [(selected)]="selectedCars">
    
        <ng-template #labelTemplate ng-label-tmp let-item="item" let-clear="clear">
          <span class="ng-value-label">{{item.metadata.name}}</span>
          <span class="ng-value-icon right" (click)="clear(item)" aria-hidden="true">×</span>
        </ng-template>
    
        <ng-template #optionTemplate ng-option-tmp let-item="item">
          <span class="ng-value-label">{{item.metadata.name}}</span>
        </ng-template>
    </app-wrapper-select>
    
    
    <ng-select
        [items]="items"
        [(ngModel)]="selected">
    
        <ng-template ng-label-tmp let-item="item" let-clear="clear">
          <ng-container *ngTemplateOutlet="labelTemplate; context:{item: item, clear: clear}"></ng-container>
        </ng-template>
    
        <ng-template ng-option-tmp let-item="item">
          <ng-container *ngTemplateOutlet="optionTemplate; context:{item: item}"></ng-container>
        </ng-template>
    </ng-select>
    

    【讨论】:

    • 我一直在尝试做同样的事情。然而,我确实期望ng-select 中的ng-templateng-container 应该能够使用[ngTemplateOutlet][ngTemplateOutletContext] 组合起来。我从来没有设法让它工作。我很想知道是否有人对此有任何想法。
    猜你喜欢
    • 2017-10-01
    • 2020-05-07
    • 2018-09-02
    • 2018-08-02
    • 2018-08-03
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 2020-05-31
    相关资源
    最近更新 更多