簡體   English   中英

Angular 9 ng-content 動態更新

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM