【发布时间】:2019-11-23 05:25:23
【问题描述】:
我制作了一个组件,它使用 marked 包来呈现 markdown 内容,问题是当异步事件更改其 ng-content 元素时它不会重新呈现自己。
这是代码
import {Component, ElementRef, AfterContentInit} from 'angular2/core';
declare var marked: any;
@Component({
selector: 'markdown',
template:
'<div style="display:none;">' +
' <ng-content></ng-content>' +
'</div>' +
'<div class="markdown" [innerHTML]="output"></div>'
})
export class MarkdownComponent implements AfterContentInit {
output: string;
constructor(
private element: ElementRef) {
}
ngAfterContentInit() {
const c = this.element.nativeElement.childNodes;
this.output = marked(c[0].textContent);
}
}
这是 HTML sn-p:
<markdown>{{info}}</markdown>
这是异步更新:
updateInfo(text: string) {
this.svc.update(this.info, text).subscribe(
data => this.info = data.newText);
}
问题是,当this.svc.update 事件触发时,info 变量的值会发生变化,但markdown 组件不会重新渲染。
谢谢!
分辨率
按照公认答案的建议(感谢 Gunter),这是新组件,它更精简:
import {Component} from 'angular2/core';
declare var marked: any;
@Component({
selector: 'markdown',
template: '<div class="markdown" [innerHTML]="process(md)"></div>',
inputs: ['md']
})
export class MarkdownComponent {
md: string;
process(s: string) {
if (!s) return '';
return marked(s);
}
}
这是新的 HTML:
<markdown [md]="info"></markdown>
完美运行! :)
【问题讨论】:
标签: angular