【问题标题】:Inserting ng-template into child component not rendering the passed in template将 ng-template 插入子组件不渲染传入的模板
【发布时间】:2019-03-01 21:25:34
【问题描述】:

我有一个名为 auth 的父组件。在这个组件中,我有一个 ng-template,它是一个代表登录/注册表单的表单,如下所示:

`<ng-template #authForm>
    <form [formGroup]="authForm" (ngSubmit)="onSubmit()">
      <mat-form-field>
        <input matInput placeholder="Username" formControlName="userName" >
        <mat-error *ngIf="postForm.get('userName').invalid">You must enter a value</mat-error>
      </mat-form-field>
      <mat-form-field>
        <input matInput placeholder="E-mail" formControlName="email" >
        <mat-error *ngIf="postForm.get('email').invalid">You must enter a value</mat-error>
      </mat-form-field>
      <mat-form-field>
        <input matInput placeholder="Password" formControlName="password" type="password">
        <mat-error *ngIf="postForm.get('password').invalid">You must enter a value</mat-error>
      </mat-form-field>
    </form>
  </ng-template>`

在同一个父组件中,我使用角材质mat-tab-group组件来显示登录组件或注册组件:

`<mat-tab-group (selectedTabChange)="onSignup($event)">
    <mat-tab label="Login">
        <ng-container *ngIf="!isSignup">
            <app-login [loginForm]="authForm"></app-login>  
          </ng-container>
    </mat-tab>
    <mat-tab label="Sign Up"> 
        <ng-container *ngIf="isSignup">
            <app-signup></app-signup>
          </ng-container>
    </mat-tab>
</mat-tab-group>`

在子组件上,例如 LoginComponent。我有一个@Input() loginForm: TemplateRef&lt;any&gt;。每当我尝试渲染传入的模板时,什么都不会显示,我不知道为什么这不起作用:

`<ng-container 
  *ngTemplateOutlet="loginForm">
</ng-container>`

【问题讨论】:

  • 可能是*ngIf="!isSignup"这个flag,检查app-login的ngOnInit是否被调用
  • 是的,我在 LoginComponent 内的 ngOnInit 中有一个日志,它被调用了。当我不将任何模板传递给子组件时,它们渲染得很好。在登录和注册之间切换按预期工作。但是一旦我尝试向下传递一个元素,它就会停止工作。
  • 你能重现堆栈闪电战吗?
  • 正在处理中。
  • stackblitz.com/edit/angular-nbt54q - 这是我对表单的基本设置

标签: angular


【解决方案1】:

问题是你有两个authForm 变量名。将 ng-template 名称更改为其他名称,如下所示。工作样本Stackblitz

<ng-template #authFormTemplate>
    <form [formGroup]="authForm" (ngSubmit)="onSubmit()">
      <mat-form-field>
        <input matInput placeholder="Username" formControlName="userName" >
        <mat-error *ngIf="postForm.get('userName').invalid">You must enter a value</mat-error>
      </mat-form-field>
      <mat-form-field>
        <input matInput placeholder="E-mail" formControlName="email" >
        <mat-error *ngIf="postForm.get('email').invalid">You must enter a value</mat-error>
      </mat-form-field>
      <mat-form-field>
        <input matInput placeholder="Password" formControlName="password" type="password">
        <mat-error *ngIf="postForm.get('password').invalid">You must enter a value</mat-error>
      </mat-form-field>
    </form>
  </ng-template>

<mat-tab-group (selectedTabChange)="onSignup($event)">
    <mat-tab label="Login">
        <ng-container *ngIf="!isSignup">
            <app-login [loginForm]="authFormTemplate"></app-login>  
          </ng-container>
    </mat-tab>
    <mat-tab label="Sign Up"> 
        <ng-container *ngIf="isSignup">

          </ng-container>
    </mat-tab>
</mat-tab-group>

【讨论】:

  • 嗯,我认为这可以解决这个问题,但我仍然看到同样的事情。这不完全是。不过好主意。我更改了变量名,但它不起作用。要么
  • 你说得对,它正在工作。这与我的条件逻辑有关。非常感谢!
猜你喜欢
  • 2019-01-31
  • 2020-04-22
  • 2011-11-02
  • 2018-08-03
  • 2013-08-03
  • 2018-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多