首页 文章

Angular2在for循环中加载动态内容/ html

提问于
浏览
10

我有一个json数组,可以包含我想要加载的组件的组件或html选择器 . 我试图在for循环中加载这些数据 . 当我尝试插入值{}时,它会显示为计划文字 . 当我使用下面的innerHTML方法并检查dom时,我看到那里的html,但它不像一个自定义组件(dom只包含而不是初始化它并用组件模板替换它) .

我看过动态内容加载器,但看起来不合适 . 这是for循环,因此不能使用模板语法,因此loadIntoLocation不适合我 . 如果组件有任何输入,也不确定它是如何工作的 .

<div *ngFor="#d of dtabs" class="tab-pane" id="tab-{{d.component}}">
  <div [innerHTML]="d.html"></div>
</div>

2 回答

  • 3

    我也在寻找一种方法 . 我看到了@guyoung的答案并根据它 Build 了一些东西 . 但后来,我意识到 DynamicComponentLoader.loadIntoLocation() 在上一版本中不再存在, DynamicComponentLoader 已被弃用 .

    我阅读了一些文档和帖子,并创建了一个工作正常的新指令 . 查看:

    import {
      Component,
      ComponentResolver,
      Directive,
      ViewContainerRef,
      Input,
      Injector,
      ApplicationRef
    } from "@angular/core";
    
    /**
    
      This component render an HTML code with inner directives on it.
      The @Input innerContent receives an array argument, the first array element
      is the code to be parsed. The second index is an array of Components that
      contains the directives present in the code.
    
      Example:
    
      <div [innerContent]="[
        'Go to <a [routerLink]="[Home]">Home page</a>',
        [RouterLink]
      ]">
    
    **/
    @Directive({
      selector: '[innerContent]'
    })
    export class InnerContent {
    
      @Input()
      set innerContent(content){
        this.renderTemplate(
          content[0],
          content[1]
        )
      }
    
      constructor(
        private elementRef: ViewContainerRef,
        private injector: Injector,
        private app: ApplicationRef,
        private resolver:ComponentResolver){
      }
    
      public renderTemplate(template, directives) {
        let dynComponent = this.toComponent(template, directives)
        this.resolver.resolveComponent(
          dynComponent
        ).then(factory => {
          let component = factory.create(
            this.injector, null, this.elementRef._element.nativeElement
          );
    
          (<any>this.app)._loadComponent(component);
          component.onDestroy(() => {
            (<any>this.app)._unloadComponent(component);
          });
          return component;
        });
      }
    
    private toComponent(template, directives = []) {
      @Component({
        selector: 'gen-node',
        template: template,
        directives: directives
      })
      class DynComponent {}
        return DynComponent;
      }
    }
    
  • 9

    Angular2动态渲染模板

    import { Component, View, DynamicComponentLoader, ElementRef} from 'angular2/core';
    import {bootstrap}    from 'angular2/platform/browser'
    
    @Component({
        selector: 'some-component',
        properties: ['greeting'],
        template: `
        <b>{{ greeting }}</b>
      `
    })
    class SomeComponent { }
    
    @Component({
        selector: 'app'
    })
    @View({
        template: `
        <h1>Before container</h1>
        <div #container></div>
        <h2>After container</h2>
      `
    })
    class App {
        loader: DynamicComponentLoader;
        elementRef: ElementRef;
    
        constructor(loader: DynamicComponentLoader, elementRef: ElementRef) {
            this.laoder = loader;
            this.elementRef = elementRef;
    
            // Some async action (maybe ajax response with html in it)
            setTimeout(() => this.renderTemplate(`
          <div>
        <h2>Hello</h2>
        <some-component greeting="Oh, hey"></some-component>
          </div>
        `, [SomeComponent]), 1000);
        }
    
        renderTemplate(template, directives) {
            this.laoder.loadIntoLocation(
                toComponent(template, directives),
                this.elementRef,
                'container'
            )
        }
    }
    
    function toComponent(template, directives = []) {
        @Component({ selector: 'fake-component' })
        @View({ template, directives })
        class FakeComponent { }
    
        return FakeComponent;
    }
    
    
    bootstrap(App);
    

    完整代码:https://github.com/guyoung/GyPractice-Angular2Advanced/tree/master/apps/dynamically_render_template

相关问题