具有异步操作的angular2-markdown失败

angular2-markdown with async operation fails

我在 Angular 4.x 应用程序中使用 angular2-markdown

我有组件:

<div class="content" mat-padding>
        <md-card class="mat-elevation-z2" mat-whiteframe="8">
            <div class="cover-wrapper">
                <img md-card-image src="{{ article?.cover }}">
            </div>
            <md-card-title fxFlex="100%">
                <span>{{ article.title }}</span>
            </md-card-title>
            <md-card-content>
                <markdown [data]="article.text"></markdown>
            </md-card-content>
        </md-card>
</div>

组件设置如下:

import { Component, Input, OnInit } from '@angular/core';
import { ActivatedRoute }   from '@angular/router';

import { Article } from '../../models/article';

import { ArticleStore } from '../../state/ArticleStore';
import { InterModuleService } from '../../service/inter-module.service';

@Component({
  selector: 'app-article-detail',
  templateUrl: './article-detail.component.html',
  styleUrls: ['./article-detail.component.css']
})
export class ArticleDetailComponent implements OnInit {

  private article: Article;

  constructor( private route: ActivatedRoute, 
               private articleStore: ArticleStore,
               private interModuleService: InterModuleService ) { }

  ngOnInit(): void {
    this.interModuleService.article
        .subscribe((data) => {
            this.article = data;

            Promise.all(Object.keys(this.article['attachments']).map((at) => {
                return this.articleStore.getAttachment(this.article['id'],at).then ((res) => {
                    this.article.attachments[at]['data'] = res.toString();
                })
            })).then(()=> {
                this.interModuleService.sidenavToc.nativeElement['innerHTML'] = this.article.attachments['toc'].data;
            });

        });
    this.route.data
        .subscribe((data: { article: Article } ) => {
            this.interModuleService.article.next(data.article);
            this.interModuleService.article.complete();
        });
  }
}

根据 angular2-markdown 的文档,我有几个选项可用于将 Markdown 过滤为 HTML:

<div Markdown>
    ### your markdown code
</div>

<!-- or use angular component -->

<markdown>
    ### your markdown code
</markdown>

<!-- to load from remote URL -->

<div Markdown path="/path/to/readme.md"></div>

<!-- load remote source code with auto syntax highlighting -->

<markdown path="/path/to/code.cpp"></markdown>

<markdown path="/path/to/code.java"></markdown>

<!-- load remote source code from url stored in variable
(see additional details about variable binding in the next section) -->

<markdown [path]="urlVariable"></markdown>

不过,none的作品。通常,article.text 总是 null/undefined。

不过,如果我要执行 <div Markdown [innerHTML]='article.text'></div> 我会从 var 中获取文本,但它是一个带引号的字符串,angular2-markdown 会忽略它。屏幕截图如下。

完整项目 -> https://github.com/flamusdiu/micro-blog

在查看更多源代码后,我意识到我可以直接调用该服务,直接 return HTML。

这是更新后的组件:

import { Component, Input, OnInit } from '@angular/core';
import { ActivatedRoute }   from '@angular/router';

import { MarkdownService } from 'angular2-markdown';

import { Article } from '../../models/article';

import { ArticleStore } from '../../state/ArticleStore';
import { InterModuleService } from '../../service/inter-module.service';

@Component({
  selector: 'app-article-detail',
  templateUrl: './article-detail.component.html',
  styleUrls: ['./article-detail.component.css']
})
export class ArticleDetailComponent implements OnInit {

  private _cover: string;
  private _text: string;
  private _toc: string;
  private _title: string;

  constructor( private route: ActivatedRoute, 
               private articleStore: ArticleStore,
               private interModuleService: InterModuleService,
               private mdService: MarkdownService ) { }

  ngOnInit(): void {
    this.interModuleService.article
        .subscribe((data) => {
            let article: Article = data;
            this._cover = article.cover;
            this._title = article.title;

            Promise.all(Object.keys(article['attachments']).map((at) => {
                return this.articleStore.getAttachment(article['id'],at).then ((res) => {
                    article.attachments[at]['data'] = res.toString();
                })

            })).then(()=> {
                this._text = this.mdService.compile(article.text);
                this._toc = this.mdService.compile(article.toc)
                this.interModuleService.sidenavToc.nativeElement['innerHTML'] = this._toc;
            });

        });
    this.route.data
        .subscribe((data: { article: Article } ) => {
            this.interModuleService.article.next(data.article);
            this.interModuleService.article.complete();
        });
  }
}