[英]Angular 9 ng-content dynamic update
我如何通過更新內容元素上的選擇器來更新 ng-content?
我在 app.component.html 中有代碼:
<my-slider>
<img src="../../assets/logo1.png" />
<img src="../../assets/logo2.png" />
</my-slider>
這是 my-slider.component.ts 的代碼:
@Component({
selector: 'my-slider',
template: '<ng-content select=".render" ></ng-content>
<button (click)="render()"> Show</button>',
styleUrls: ['./slider.component.css']
})
export class SliderComponent {
@ContentChildren(ImgComponent) img: QueryList<ImgComponent>;
constructor() { }
render() {
this.img.last.show();
}
}
和 ImgComponent.ts
@Component({
selector: 'img',
template: '',
})
export class ImgComponent {
render: boolean = false;
constructor(
private elRef: ElementRef,
private renderer: Renderer2
) { }
show() {
this.render = true;
this.renderer.addClass(this.elRef.nativeElement, 'render');
}
hide() {
this.render = false;
this.renderer.removeClass(this.elRef.nativeElement, 'render');
}
}
當我單擊按鈕時,會向元素添加一個類,但 ng-content 永遠不會更新。 我能以某種方式使它工作嗎? 或者我如何過濾 ng-content 中的組件?
我沒有關於ng-content
更新的問題的答案,並且ng-content
是 Angular 恕我直言的一個記錄不足的功能。 但我確實有解決問題的方法:
<img
*ngFor="let img of images"
[style.display]="img.render ? undefined : 'none'"
[src]="img.src"
></img>
然后在組件上創建一個public images: {render: boolean, src: string}[]
並切換項目的render
屬性。
您需要訪問組件中的宿主元素,因為您提出的解決方案將自定義 img 組件封裝到本機組件中。 我建議在這里使用自定義屬性指令。 參見Stackblitz 示例
謝謝大家的回復。 這是我一直在尋找的解決方案:
我已經向 img 添加了一個結構指令,而不是讓它成為角度組件,現在 app.component.html 看起來像:
<app-slider>
<img *myImg scr="../../assets/logo1.png" />
<img *myImg scr="../../assets/logo1.png" />
</app-slider>
my-slider.component.ts 並沒有真正改變。 我只是刪除select='.render'
反正這里是:
@Component({
selector: 'app-slider',
template: `<ng-content></ng-content>
<br/>
<button (click)="render()">Toggle</button>`,
})
export class SliderComponent {
@ContentChildren(ImgDirective) img: QueryList<ImgDirective>;
constructor() { }
ngAfterContentInit() {
this.img.first.show();
}
render() {
if (!this.img.last.render) {
this.img.last.show();
} else {
this.img.last.hide();
}
}
}
最后我的結構指令 ImgDirective:
import { Directive, TemplateRef, ViewContainerRef } from '@angular/core';
@Directive({
selector: '[myImg]'
})
export class ImgDirective {
render: boolean = false;
constructor(
private viewContainer: ViewContainerRef,
private templateRef: TemplateRef<any>,
) { }
ngOnInit() {
this.viewContainer.clear();
}
show() {
this.render = true;
this.viewContainer.createEmbeddedView(this.templateRef)
}
hide() {
this.render = false;
this.viewContainer.clear();
}
}
這是現場示例: 鏈接
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.