Angular2.0+动态绑定html文本


背景:

Angular2项目网站需要一个容器页面,可以展示用户自定义开发的html文本(包含css,js,html等)

如下图,编辑好css,js及html后,在右侧可以实时查看展示效果,并且可以执行按钮事件。

思路:

      定义一个通用组件容器接受js,css参数,组件中template对象加载html,styles对象加载css,并通过Renderer类注入js脚本。

实现:

1.创建树组件  dynamic-com.component.ts

import { SharedModule } from '../../../module/shared-module/shared-module'; import { Renderer2, Inject } from '@angular/core'; import { DOCUMENT } from '@angular/platform-browser';
@Component({   selector: 'app-dynamic-com',   template: `          `,   styleUrls: ['./dynamic-com.component.css'] }) export class DynamicComComponent implements OnInit {   dynamicComponent: any;   dynamicModule: NgModuleFactory;   @Input('html') html: string;  //接收html
  @Input('js') js: string;  
  @Input('css') css: string;
  @Input('dataSource') dataSource: any;  //html中需要绑定的数据源
  constructor(private compiler: Compiler) { }
  //改变后重新编译生成html   ngOnChanges(changes: SimpleChanges) {     if (changes['html'] && !changes['html'].isFirstChange() ||       changes['css'] && !changes['css'].isFirstChange() ||       changes['js'] && !changes['js'].isFirstChange() ||       (changes['dataSource'] && !changes['dataSource'].isFirstChange())) {       this.dynamicComponent = this.createNewComponent(this.html, this.dataSource);         this.dynamicModule = this.compiler.compileModuleSync(this.createComponentModule(this.dynamicComponent));     }   }
  ngOnInit() {     this.dynamicComponent = this.createNewComponent(this.html, this.dataSource);     this.dynamicModule = this.compiler.compileModuleSync(this.createComponentModule(this.dynamicComponent));   }
  protected createComponentModule(componentType: any) {     @NgModule({       imports: [SharedModule],       declarations: [         componentType       ],       entryComponents: [componentType]       })     class RuntimeComponentModule {     }
    // a module for just this Type     return RuntimeComponentModule;   }
  protected createNewComponent(template: string, dataSource: any) {     console.log(this.js + template);     let comJs = this.js;     let comCss = this.css;
    @Component({       selector: 'dynamic-component',       template: template ? template : '
',       styles: [comCss]     })     class MyDynamicComponent {       public list: any = dataSource;
    constructor(private _renderer2: Renderer2,       @Inject(DOCUMENT) private _document,       private elementRef: ElementRef) {     }     //注入js
    ngAfterViewInit() {       if (comJs) {         var s = document.createElement("script");         s.type = "text/javascript";         //s.src = "http://";         //s.text = `function test(){alert(111);}`;         s.text = comJs;         this.elementRef.nativeElement.appendChild(s);       }     }   }
  return MyDynamicComponent;   } }

2.引入组件 

form-design.component.html

可以通过来引入组件

  

编辑您的代码:

  
  

css:

  
  

js:

  
  

html:

  


  

查看结果:

  
  

3. form-design.component.ts组件类定义参数


@Component({   selector: 'app-form-design',   templateUrl: './form-design.component.html',   styleUrls: ['./form-design.component.css'] }) export class FormDesignComponent implements OnInit {
  dataSource: Array = [];   css=`.myDiv{ font-size:20px}       #div1{color:red}`;   js=` function test(){       alert(111)      }`;   html = `
按钮:
        
文字
`;     constructor(private listService: ListService) {   }
  ngOnInit() {} }

 

 

相关