typescript - Creează TemplateRef într-un serviciu Angular 10


Folosim ngZorro într-un proiect Angular 10. Acum vreau să deschid drawer-ul (https://ng.ant.design/components/drawer/en) pentru a afișa formulare. Scenariul este o listă de, de exemplu, produse și la un clic pe unul dintre produse, formularul acestuia ar trebui să se deschidă în drawer.

Folosesc NzDrawerService pentru a crea sertarul, dar nu pot seta niciun footer (numit nzFooter).

De exemplu, există un ProductFormComponent, așa că în ProductService.ts pot pur și simplu să apelez:

openForm(){
  const drawerRef = this.drawerService.create({
      nzTitle: 'My Title',
      nzContent: ProductFormComponent
  });
  drawerRef.open()
}

Acum, există și o opțiune pentru un subsol predefinit (nzFooter?: string | TemplateRef<{}>), unde vreau să adaug butoanele pentru salvare și anulare. Acum întrebarea: Cum pot obține un TemplateRef aici, deoarece funcția este apelată într-un serviciu și nu într-un component?

Răspuns #1

Dacă aș avea un singur șablon pe care aș vrea să-l injectez într-un serviciu, aș folosi un component „dummy”, pe care l-aș folosi pentru a injecta un șablon în serviciul meu.

Poți adăuga o funcție pe serviciul de sertar pentru a seta un templateRef:

private template: TemplateRef<any>;
setTemplate(template: TemplateRef<any>) {
  this.template = template;
}

componenta ar arăta astfel:

@Component({
  selector: "template-injector",
  template: `
    <ng-template #myTemplate>
      <h1>Best Template!</h1>
    </ng-template>
  `,
  styleUrls: []
})
export class TemplateInjectorComponent implements AfterViewInit {
  constructor(private derviceService: DrawerService) {}

  @ViewChild("myTemplate") template: TemplateRef<any>;

  ngAfterViewInit(): void {
    this.derviceService.setTemplate(this.template);
  }
}

și în cele din urmă, găsiți componenta principală din aplicația dvs. și încărcați TemplateInjectorComponent, deoarece șablonul este doar <ng-template>, nimic nu este redat (un loc bun pentru a-l adăuga ar fi la sfârșitul componentului de layout).

Alternativ, în loc să creezi un component nou, îl poți adăuga la componenta principală a aplicației.