我正在使用ngx-markdown来呈现我的FAQ,在其中,我已链接到外部资源(从http
开始)和内部资源(从/
开始)。
我想将角形路由器传递给我的markedOptionsFactory,以便将其用于本地资源。
导入模块时是否可以在装饰器中传递有角路由器:
imports: [
[...]
MarkdownModule.forRoot({
provide: MarkedOptions,
useFactory: markedOptionsFactory,
}),
[...]
],
仅供参考,我的markedOptionsFactory
如下:
export function markedOptionsFactory(): MarkedOptions {
const renderer = new MarkedRenderer();
renderer.link = (href: string, title: string, text: string) => {
const isLocalLink = /^\//.test(href);
const target = isLocalLink ? '_self' : '_blank';
const hrefContent = isLocalLink ? `javascript:router.navigateByUrl('${href}')` : href;
return `<a href="${hrefContent}" target="${target}">${text}</a>`;
};
return {
renderer: renderer,
[...]
};
}
答案 0 :(得分:0)
我没有从Angular找到直接解决方案。我必须从marked.js创建一个自定义事件,然后在DOM树中将其捕获得更高。
以下是我的一些工作代码:
renderer.link = (href: string, title: string, text: string) => {
const isLocalLink = /^\//.test(href);
let hrefContent;
if (isLocalLink) {
hrefContent = `javascript:document.dispatchEvent(new CustomEvent('routeTo', {detail: '${href}'})); void(0)`;
} else {
hrefContent = href;
}
return `<a href="${hrefContent}">${text}</a>`;
};
this.window.document.addEventListener('routeTo', (e: CustomEvent) => {
e.preventDefault();
router.navigateByUrl(e.detail);
}, false);
请注意,对于Internet Explorer,您需要自定义事件的填充(polyfill)
答案 1 :(得分:-1)