You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular2模板解析报错:templateRef.createEmbeddedView不是函数

解决 ERROR TypeError: templateRef.createEmbeddedView is not a function 问题

这个错误我之前排查过几次,根源是你的模板结构存在两个关键问题,导致Angular无法正确解析ngIfElse的模板引用,进而抛出这个错误。我帮你拆解下问题并给出修复方案:

错误原因分析

  • HTML结构不规范:<ul>的直接子元素是<span>,但根据HTML标准,<ul>只能包含<li>、<script>或<template>这类元素。非<li>的直接子元素会干扰Angular对模板的解析逻辑。
  • ngIf指令用法错误:你把[ngIf]属性绑定到了<ng-template>上,这是不正确的用法。ngIf作为结构指令,要么用*ngIf语法糖直接绑定到DOM元素上,要么通过<ng-template>配合ngIf的显式语法(更推荐用语法糖)。这种错误用法会导致Angular无法正确识别模板引用,从而触发createEmbeddedView的错误。

修复后的代码

首先我们用<ng-container>替换<span>(它不会生成额外DOM元素,适合包裹循环和条件判断),然后把条件判断直接绑定到<li>上,修正后的代码如下:

<ul *ngIf="quizData.quiz.questions[quizData.quiz.curQuestion].locked == true; else optionBlock">
  <ng-container *ngFor="let option of quizData.quiz.questions[quizData.quiz.curQuestion].options; let i = index">
    <li *ngIf="option.answer == '' && option.right_answer == 'No'" readonly class="w3-light-grey">
      {{option.option}}
    </li>
    <li *ngIf="option.answer == 'right' || option.right_answer == 'Yes'" readonly class="w3-green">
      {{option.option}}
    </li>
    <li *ngIf="option.answer == 'wrong'" readonly class="w3-red">
      {{option.option}}
    </li>
  </ng-container>
</ul>
<ng-template #optionBlock>
  <button (click)="options($event)" 
          *ngFor="let option of quizData.quiz.questions[quizData.quiz.curQuestion].options; let i = index" 
          [id]="i" 
          class="w3-button w3-light-grey">
    {{option.option}}
  </button>
</ng-template>

额外优化建议

你还可以用[ngClass]动态绑定样式,让代码更简洁易维护,避免重复的*ngIf:

<ul *ngIf="quizData.quiz.questions[quizData.quiz.curQuestion].locked; else optionBlock">
  <li *ngFor="let option of quizData.quiz.questions[quizData.quiz.curQuestion].options"
      readonly
      [ngClass]="{
        'w3-light-grey': option.answer === '' && option.right_answer === 'No',
        'w3-green': option.answer === 'right' || option.right_answer === 'Yes',
        'w3-red': option.answer === 'wrong'
      }">
    {{option.option}}
  </li>
</ul>
<ng-template #optionBlock>
  <button (click)="options($event)" 
          *ngFor="let option of quizData.quiz.questions[quizData.quiz.curQuestion].options; let i = index" 
          [id]="i" 
          class="w3-button w3-light-grey">
    {{option.option}}
  </button>
</ng-template>

这样修改后,Angular就能正确解析模板结构,else optionBlock的引用也能正常工作,不会再抛出那个错误了。

内容的提问来源于stack exchange,提问作者AMit SiNgh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:39:40