也许我从根本上误解了某些东西,但我试图让 TemplateRef 指向我的组件模板(在下面的简单示例中只是“Hello”)。我已将代码精简到最低限度以尝试找出问题:
import { Component, TemplateRef} from '@angular/core';
@Component({
selector: 'app-root',
template: `Hello`,
styleUrls: ['./app.component.css']
})
export class AppComponent implements AfterViewInit {
constructor(private tr: TemplateRef<any>) {}
}
Run Code Online (Sandbox Code Playgroud)
这实际上并没有“做”任何事情,因为我已经删除了所有功能,但我希望它能起作用。当我运行这段代码时,我收到一个错误:没有 TemplateRef 的提供者,但我在 SO 和其他地方看到了示例,这显然是有效的。我缺少什么?
角度 4.2.4
谢谢。
我知道它已经过时了,但让我回答一下,因为过去几天我一直在努力解决同样的问题。可以通过构造函数将 TemplateRef 注入到代码中的唯一方法是当您在结构指令内工作时(带有星号 * 的指令)您会看到所有组件都是使用 View Factory 创建的,因此它们被创建为 Host View-s。即使您在标签中扭曲它们,您也无法将 TemplateRef 注入组件中。
结构指令与此不同:
<div *myDirective="1">Tesla was robbed !!!!</div>
Run Code Online (Sandbox Code Playgroud)
变成这样:
<ng-template [SomeVariable]="3000">
<div>Tesla was robbed !!!!</div>
</ng-template>
Run Code Online (Sandbox Code Playgroud)
渲染如下:
<!--bindings={
"ng-reflect-directive-somevariable": "3000"
}-->
<div>Tesla was robbed !!!!</div>
Run Code Online (Sandbox Code Playgroud)
因为它们是作为嵌入视图创建的,所以您可以注入模板。如果你仔细想想,这是有道理的。因为最初出现在 DOM 中的只是 html 注释。你必须告诉 Angular 来渲染<div>标签。你这样做:
this.viewContainerRef.createEmbeddedView(this.templateRef);
Run Code Online (Sandbox Code Playgroud)
*ngIf 就是这样工作的。如果没有结构指令的概念,您将不得不在组件内创建条件逻辑。并手动添加或删除您需要的视图。你可以用角度来做到这一点,但它更混乱。
| 归档时间: |
|
| 查看次数: |
2823 次 |
| 最近记录: |