没有TemplateRef的提供者!(NgIf->TemplateRef)。

346

如果答案被接受,我想展示一个复选标志:

template: `<div ngIf="answer.accepted">&#10004;</div>`

但是我遇到了这个错误:

EXCEPTION: No provider for TemplateRef! (NgIf ->TemplateRef)

我做错了什么?

3个回答

867

你忘记在NgIf前面加上*了(就像我们所有人都做过的那样,多次):

<div *ngIf="answer.accepted">&#10004;</div>
没有使用星号(*)时,Angular会将ngIf指令应用于div元素,但由于没有星号或

6
如果您在没有星号的情况下使用ngSwitchCase,也可能会出现相同的异常情况! - cmxl
1
我想给这个点赞,但我发现很久以前我已经点过赞了。 - CMS
错误检查器不能注意到它以“ng”开头并在底部添加:“找到ng__,你是不是想说*ng__?”(也许他们认为这太过于热心地帮助开发人员了。) - StackOverflowUser

13

所以,我可以帮助您了解您的错误是什么(以及在哪里),但在此之前,我们需要阅读文档:

通过在元素上放置指令(或带有*前缀的指令)来访问TemplateRef实例。针对嵌入视图的TemplateRef将使用TemplateRef标记注入到指令的构造函数中。

您还可以使用查询来查找与组件或指令关联的TemplateRef。

因此:

  • 当使用[ngIf]="something"时,您必须使用<ng-template>来访问模板引用(例如:使用<template><ng-template>);
  • 使用*ngIf,您可以在任何地方使用它,因为*保证了对模板引用的访问(例如:使用<span><div>);

如果您在代码中使用类似于<span [ngIf]="message"> {{message}}</span>的东西,可能会出现一些错误。


1
太棒了。你解决了我的问题。不知何故,<template>必须替换为<ng-template>才能正常工作。 - duracell
不客气,先生。 <3 - Jonathan Duclos

4

在编写代码时,常见的一个误解是会错过一些语法,其中一个流行的错误就是在使用ngIf之前不加*号,这会导致Angular编译器将ngIf读取为模板引用变量,并检查变量的本地引用,而该引用在文件中找不到。因此,请检查这些错误并尽可能从中学习。

<div *ngIf="answer.accepted">&#10004;</div>

哦,谢谢您的贡献。但是这个答案和@Mark_Rajcok的有什么不同呢? - Jan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接