Angular 不渲染第二个 <ng-content></ng-content>
Angular doesn't render second <ng-content></ng-content>
我正在尝试构建一个 'SmartLinkComponent' 可以区分内部和外部链接,同时可以将任何 html 内容包装在标签中。我想出了以下解决方案 (smart-link.component.html):
<a *ngIf="!isInternal" [href]="link" target="_blank" [title]="title">
<ng-content></ng-content>
</a>
<a *ngIf="isInternal" [routerLink]="link" [title]="title">
<ng-content></ng-content>
</a>
解析 isInternal
变量的逻辑完美无缺,因此我不包括此处的代码。
问题是此代码仅适用于布局中出现的第一个。上面发布的代码仅呈现 !isInternal
的链接。当我这样交换代码时:
<a *ngIf="isInternal" [routerLink]="link" [title]="title">
<ng-content></ng-content>
</a>
<a *ngIf="!isInternal" [href]="link" target="_blank" [title]="title">
<ng-content></ng-content>
</a>
然后 angular 只为内部链接呈现 <ng-content></ng-content>
。
当 <ng-content></ng-content>
没有任何关联的 select
指令时,它甚至似乎只能在布局中使用一次,但我找不到任何关于此的文档。但是,这里的*ngIf
条件是互斥的,所以我真的不知道是什么问题。
编辑:这是 smart-link.component.ts 的(匿名)代码:
import {Component, Input, OnInit} from '@angular/core';
@Component({
selector: 'app-smart-link',
templateUrl: './smart-link.component.html',
styleUrls: ['./smart-link.component.scss']
})
export class SmartLinkComponent implements OnInit {
isInternal: boolean = true;
@Input("href") originalLink: string;
@Input() title: string;
link: string;
constructor() {
}
ngOnInit() {
if (this.originalLink) {
console.log('original link', this.originalLink);
if (some rules) {
this.isInternal = true;
this.link = // transform link
} else {
this.isInternal = false;
this.link = this.originalLink;
}
}
console.log('evaluating link', this.originalLink, ' as internal ', this.isInternal, this.link);
}
}
正如@Shikha 在评论中提到的,如果不指定 'select' 指令,则无法使用多个 ng-content 元素。使用来自 angular GitHub 存储库 https://github.com/angular/angular/issues/24567 的响应,我能够将解决方案修复为仅包含 ng-container 一次,如下所示:
<a *ngIf="link && !isInternal" [href]="link" target="_blank" [title]="title">
<ng-container *ngTemplateOutlet="linkTemplate"></ng-container>
</a>
<a *ngIf="link && isInternal" [routerLink]="link" [title]="title">
<ng-container *ngTemplateOutlet="linkTemplate"></ng-container>
</a>
<ng-template #linkTemplate>
<ng-content></ng-content>
</ng-template>
我正在尝试构建一个 'SmartLinkComponent' 可以区分内部和外部链接,同时可以将任何 html 内容包装在标签中。我想出了以下解决方案 (smart-link.component.html):
<a *ngIf="!isInternal" [href]="link" target="_blank" [title]="title">
<ng-content></ng-content>
</a>
<a *ngIf="isInternal" [routerLink]="link" [title]="title">
<ng-content></ng-content>
</a>
解析 isInternal
变量的逻辑完美无缺,因此我不包括此处的代码。
问题是此代码仅适用于布局中出现的第一个。上面发布的代码仅呈现 !isInternal
的链接。当我这样交换代码时:
<a *ngIf="isInternal" [routerLink]="link" [title]="title">
<ng-content></ng-content>
</a>
<a *ngIf="!isInternal" [href]="link" target="_blank" [title]="title">
<ng-content></ng-content>
</a>
然后 angular 只为内部链接呈现 <ng-content></ng-content>
。
当 <ng-content></ng-content>
没有任何关联的 select
指令时,它甚至似乎只能在布局中使用一次,但我找不到任何关于此的文档。但是,这里的*ngIf
条件是互斥的,所以我真的不知道是什么问题。
编辑:这是 smart-link.component.ts 的(匿名)代码:
import {Component, Input, OnInit} from '@angular/core';
@Component({
selector: 'app-smart-link',
templateUrl: './smart-link.component.html',
styleUrls: ['./smart-link.component.scss']
})
export class SmartLinkComponent implements OnInit {
isInternal: boolean = true;
@Input("href") originalLink: string;
@Input() title: string;
link: string;
constructor() {
}
ngOnInit() {
if (this.originalLink) {
console.log('original link', this.originalLink);
if (some rules) {
this.isInternal = true;
this.link = // transform link
} else {
this.isInternal = false;
this.link = this.originalLink;
}
}
console.log('evaluating link', this.originalLink, ' as internal ', this.isInternal, this.link);
}
}
正如@Shikha 在评论中提到的,如果不指定 'select' 指令,则无法使用多个 ng-content 元素。使用来自 angular GitHub 存储库 https://github.com/angular/angular/issues/24567 的响应,我能够将解决方案修复为仅包含 ng-container 一次,如下所示:
<a *ngIf="link && !isInternal" [href]="link" target="_blank" [title]="title">
<ng-container *ngTemplateOutlet="linkTemplate"></ng-container>
</a>
<a *ngIf="link && isInternal" [routerLink]="link" [title]="title">
<ng-container *ngTemplateOutlet="linkTemplate"></ng-container>
</a>
<ng-template #linkTemplate>
<ng-content></ng-content>
</ng-template>