How to detect async change to ng-content

Adding an @Input() content; and using the component like

<markdown [content]="info"></markdown>

would make this easier.

Alternatively a MutationObserver should work well for this specific use case.


Even if the Günter's answer is great, I wasn't able to resist to create a little plunkr describing how to use Marked into a component: https://plnkr.co/edit/0oSeaIyMWoq5fAKKlJLA?p=preview.

Here are the details:

  • Marked configuration the HTML file

    <script>
      System.config({
        transpiler: 'typescript', 
        typescriptOptions: { emitDecoratorMetadata: true }, 
        packages: {
          'src': {defaultExtension: 'ts'}
        },
        map: {
          marked: 'https://cdnjs.cloudflare.com/ajax/libs/marked/0.3.5/marked.js'
        }
      });
      System.import('src/boot')
        .then(null, console.error.bind(console));
    </script>
    
  • The component that uses Marked

    import { Component, Input } from 'angular2/core';
    import marked from 'marked';
    
    @Component({
      selector: 'markdown', 
      template: `
        <div [innerHTML]="convertedData"></div>
      `
    })
    export class MarkdownComponent {
      @Input('data')
      data:string;
    
      ngOnChanges() { 
        this.convertedData = marked(this.data);
      }
    }
    
  • The component that uses the previous Markdown component

    import { Component } from 'angular2/core';
    import { MarkdownComponent } from './markdown';
    
    @Component({
      selector: 'my-app', 
      template: `
        <div>
          <markdown [data]="markdown"></markdown>
        </div>
      `,
      directives: [ MarkdownComponent ]
    })
    export class AppComponent {
      constructor() {
        this.markdown = 'Hello';
    
        setTimeout(() => {
          this.markdown = `
    # Title
    
    Some __test__
    `;
        }, 1000);
      }
    }
    

Tags:

Angular