Angular2 Components :: ViewChild/ContentChild

Awe*_*SIM 3 angular

我正在尝试设计一个可扩展的组件,如下所示:

<collapsable [expanded]="myFlag">
  <div title>Summary</div>
  <div alternate-title>Heading</div>
  <div content>Details</div>
</collapsable>
Run Code Online (Sandbox Code Playgroud)

alternate-title部分应该是可选的.何时myFlag = false,组件应仅渲染:

<div title>Summary</div>
Run Code Online (Sandbox Code Playgroud)

但是,当myFlag = true组件应该呈现以下之一时:

// If alternate-title exists..
<div alternate-title>Heading</div>
<div content>Details</div>

// If alternate-title does not exist..
<div title>Summary</div>
<div content>Details</div>
Run Code Online (Sandbox Code Playgroud)

现在,我有这个组件的模板定义如下:

<ng-content *ngIf="!expanded" select="[title]"></ng-content>
<ng-content *ngIf="expanded"  select="[alternate-title]"></ng-content>
<ng-content *ngIf="expanded"  select="[content]"></ng-content>
Run Code Online (Sandbox Code Playgroud)

这适用于第一种情况(如果alternate-title存在).但是,在第二种情况下,它显然不起作用(显然).为了让它适用于第二种情况,我需要alternate-title在我的组件中获得引用.一种方法是在下面:

// In page.html..
<div #alternateTitle alternate-title>...</div>

// In component.ts
@ContentChild('alternateTitle') alternateTitle: ElementRef;
Run Code Online (Sandbox Code Playgroud)

但是,我不喜欢这种方法,因为它迫使我定义一个alternate-title多余的局部变量.

有没有办法可以alternate-title在我的组件中获取引用来检查我的组件的用户是否定义了它?

Gün*_*uer 7

我们需要一个带有模板变量的包装元素:

<ng-content *ngIf="!expanded" select="[title]"></ng-content>
<span #titleWrapper><ng-content *ngIf="expanded"  select="[alternate-title]"></span></ng-content>
<ng-content *ngIf="expanded"  select="[content]"></ng-content>
Run Code Online (Sandbox Code Playgroud)

然后我们可以使用查询元素@ViewChild(),然后检查它是否包含我们所关注的内容:

@ViewChild('titleWrapper') titleWrapper:ElementRef;

ngAfterContentInit() {
  let title = this.titleWrapper.nativeElement.querySelector('[alternative-title]');
  ...
}
Run Code Online (Sandbox Code Playgroud)

  • 但是在组件中只有一次,而不是每次使用组件时都是如此.为什么你认为这是一个劣势? (2认同)
  • @GünterZöchbauer在任何情况下都可以像`select`一样指令,为`dynamic access`注入另一个指令(不要害怕脏HTML).但在这种情况下,您的解决方案是更简单的解决方案(**问题是不适用于所有情况**,主要是在添加div可能会破坏html的情况下),而且从我们的角度来看,它实现了新的资源select指令解决方案,在某些情况下是强制性的. (2认同)