javascript - Angular 6 中的多槽嵌入
问题描述
我正在尝试按照这篇博文(适用于 Angular 2)在 Angular 6 中创建一个具有多槽嵌入的组件。
我创建了一个组件:
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-criteria',
template: `
<div class="adoption-grid-column adopter">
<div class="adoption-grid-icon ">
<ng-content select="level-icon"></ng-content>
</div>
<div class="adoption-grid-body">
<ng-content select="level-description"></ng-content>
</div>
</div>
`,
styles: []
})
export class CriteriaComponent implements OnInit {
constructor() {}
ngOnInit() {}
}
然后我试图像这样使用它
<app-criteria>
<level-icon>
foo
</level-icon>
<level-description>
bar
</level-description>
</app-criteria>
但它会引发编译错误:
ERROR in : 'level-icon' is not a known element
我在这里想念什么?
我意识到我可以在这里创建子组件,但我正在寻找一种解决方案,我可以将 html 块传递到组件中的插槽(例如项目符号列表、图像等)
解决方案
ng-content
最简单的解决方案(我更喜欢的解决方案)是使用您提到的创建子组件。如果你不想创建这样的组件,你可以做两件事。
CUSTOM_ELEMENTS_SCHEMA
CUSTOM_ELEMENTS_SCHEMA
您可以通过添加到schema
功能模块的数组中来告诉 Angular 跳过它无法识别的组件。
例如
import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
@NgModule({
imports: [...]
schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
export class CustomModule { }
通过这种方式,角度不会抱怨level-icon
orlevel-description
并且嵌入会正常工作。但是,设置此选项可能会隐藏您可能遇到的其他问题。例如,您可以在使用组件时打错字,并且由于您告诉 angular you would have CUSTOM_ELEMENTS
,它不会给您错误。您最终调试了您的代码,并想知道为什么您刚刚开发的全新组件无法正常工作。
- 选择元素以外的类或属性。
当您编写<ng-content select="level-icon"></ng-content>
Angular 时,实际上会查找名为level-icon
. 你可以让它搜索类、属性等。所以你可以做的是改变它
<ng-content select="level-icon"></ng-content>
至
<ng-content select="[level-icon]"></ng-content>
或者
<ng-content select=".level-icon"></ng-content>
并按如下方式使用您的组件
<app-criteria>
<div level-icon>
foo
</div>
</app-criteria>
或者
<app-criteria>
<div class="level-icon">
foo
</div>
</app-criteria>
通过这种方式,您可以select
为ul
, 或img
. 基本上任何你想要的。
如果您仍想<level-icon>
用作元素,则必须创建子组件或使用CUSTOM_ELEMENTS_SCHEMA
.
推荐阅读
- ruby-on-rails - 如何仅在 Rails 和 postgres 中过滤记录使用日期
- flutter - 未使用 ChangeNotifier 设置用户?
- node.js - 在节点中构建项目时如何将 .env 和其他文件放在 dist 文件夹中?
- c# - LINQ to SQL - 查询包含对在不同数据上下文中定义的项目的引用。
- javascript - 使用它们的十六进制代码混合两种颜色
- apache-camel - Apache camel:从多个频道(比如 2 个 pubsub 主题)轮询,然后将消息汇总为一条消息
- angular - 如何使用打字稿访问数组内部的属性
- python - 未能找到可以处理输入的数据适配器:
, - AI Gym 中的 Keras 强化学习 - python - 使用 openpyxl 更新文件而不将其保存到新文件
- python - 收集pyHook 找不到满足pyHook要求的版本