从与类似问题相关的其他查询中可以看出,为了在< pre>中的网页中显示HTML代码.或< code>标签,那些HTML片段的某些方面需要具有HTML编码的字符(即,>需要& gt;,<需要& 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 =新FooComponent()template.replace.( ‘<’,‘&安培; LT;’)代替( ‘>’,’& gt;’);把它当作我想要做的伪代码,因为Angular组件对象没有模板属性,并且我看不到暴露该组件模板的属性.
有没有办法利用Angular框架来获取组件的HTML模板?我再次不希望替换表达式的插值内容,而是由装饰者的模板属性或其templateUrl属性与元素相关联的实际原始HTML模板?
annotation.ts
declare let Reflect: any; export function getAnnotation(typeOrFunc: Type<any>): any[]|null { // Prefer the direct API. if ((<any>typeOrFunc).annotations) { let annotations = (<any>typeOrFunc).annotations; if (typeof annotations === 'function' && annotations.annotations) { annotations = annotations.annotations; } return annotations[0]; } // API of tsickle for lowering decorators to properties on the class. if ((<any>typeOrFunc).decorators) { return convertTsickleDecoratorIntoMetadata((<any>typeOrFunc).decorators)[0]; } // API for Metadata created by invoking the decorators. if (Reflect && Reflect.getOwnMetadata) { return Reflect.getOwnMetadata('annotations',typeOrFunc)[0]; } return null; } function convertTsickleDecoratorIntoMetadata(decoratorInvocations: any[]): any[] { if (!decoratorInvocations) { return []; } return decoratorInvocations.map(decoratorInvocation => { const decoratorType = decoratorInvocation.type; const annotationCls = decoratorType.annotationCls; const annotationArgs = decoratorInvocation.args ? decoratorInvocation.args : []; return new annotationCls(...annotationArgs); }); }
接着
this.encodedExampleHtml = getAnnotation(FooComponent).template;
也可以看看
> When and how s decorator applied to the decorated classes from the @angular packages
> Read and List all exports of an angular module
> Example of how angular parses template