【发布时间】:2018-01-11 20:19:29
【问题描述】:
我正在尝试创建一个共享 Angular 组件库,以便在许多不同的 Web 项目中使用。除了共享组件库,我正在尝试创建一个 Web 项目,其中包含并显示所有这些组件和代码示例,以了解如何使用它们。
从与类似问题相关的其他查询中可以看出,为了在<pre> 或<code> 标记中的网页中显示 HTML 代码,这些 HTML sn-ps 的某些方面需要具有 HTML 编码字符(即&gt; 需要是&gt;,&lt; 需要是&lt;)。从源代码手动进行这些更改的需要非常繁琐和乏味。
我想找到一种方法来读取给定组件的 HTML 模板,进行所需的少量文本替换,然后将该值设置为要在视图中显示的属性。我见过其他类似的 SO 问题,它们的答案不同且不充分,例如 this。
如果我有foo.component.ts 如下:
import { Component } from '@angular/core';
@Component({
selector: 'foo',
template: `
<div class="foo">
<div class="content">
<ng-content select="[top-content]"></ng-content>
</div>
<div class="extra content">
<ng-content select="[bottom-content]"></ng-content>
</div>
</div>
`
})
export class FooComponent {}
我想创建一个display-foo.component.ts,内容如下:
import { Component } from '@angular/core';
import { FooComponent } from './foo.component';
@Component({
selector: 'display-foo',
template: `
<pre class="example-code">
<code>
{{encodedExampleHtml}}
</code>
</pre>
<foo>
<div top-content>TOP</div>
<div bottom-content>BOTTOM</div>
</foo>
`
})
export class DisplayFooComponent {
encodedExampleHtml: string;
constructor() {
this.encodedExampleHtml = new FooComponent().template.replace('<', '<').replace('>', '>');
}
}
本质上,这会将模板放入 UI 中,以便下一个开发人员查看和了解如何使用该类型组件的实际渲染元素以及显示实际使用时组件的外观申请。
DisplayFooComponent 中我无法弄清楚如何工作的部分是这一行 this.encodedExampleHtml = new FooComponent().template.replace('<', '&lt;').replace('>', '&gt;'); 将其作为我想做的伪代码,因为 Angular 组件对象没有模板属性,并且尽可能我看不到任何公开该组件模板的属性。
有没有办法利用 Angular 框架来获取组件的 HTML 模板? 同样,我不想替换带有表达式的内插内容,而是要关联的实际原始 HTML 模板使用装饰器的 template 属性或其 templateUrl 属性的元素?
【问题讨论】:
-
你会使用AOT吗?
-
@yurzui 是的,我正计划这样做
-
你有什么收获吗?
-
@Chris 很遗憾没有