我试图显示一个复选标记,如果一个答案是接受的答案:

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

但是我得到了这个错误:

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

我做错了什么?


你错过了NgIf前面的*(就像我们都有,几十次):

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

如果没有*,Angular会认为ngIf指令被应用到div元素上,但由于没有*或<template>标记,它无法定位模板,因此会出现错误。


如果你在Angular v5中得到这个错误:

错误:StaticInjectorError [TemplateRef]: StaticInjectorError [TemplateRef]: NullInjectorError: TemplateRef没有提供程序!

你可以有<template>…</template>在一个或多个组件模板中。修改/更新标签为<ng-template>…</ng-template>。


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

对象上的一个指令来访问TemplateRef实例 元素(或前缀为*的指令)。的TemplateRef 的构造函数中注入 指令,使用TemplateRef令牌。 您还可以使用查询来查找与对象关联的TemplateRef 组件或指令。

So:

当使用[ngIf]="something"时,你必须使用<ng-template>来访问模板ref(例如:当使用<template>或<ng-template>时); 使用*ngIf你可以在你想要的地方使用它,因为*保证了对template ref的访问权限(例如:当使用<span>或<div>时);

如果你在你的代码中使用类似<span [ngIf]="message"> {{message}}</span>这样的东西,你可能会得到一些错误。


在编写代码时,有一个常见的错误就是在ngIf之前没有使用*,这使得angular编译器将ngIf作为模板引用变量,并检查在文件中找不到的变量的局部引用。因此,请检查这些错误并从中吸取教训

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