2017-05-17 3 views
1

Ich versuche, einen Editor zu erstellen, der auf benutzerdefinierten HTML-Seiten funktioniert. Also muss ich meinen Angular Custom HTML-Code laden.So laden Sie dynamisch eine Komponente mit einer spezifischen TemplateUrl in Angular

Ich bin verzweifelt auf der Suche nach einer Möglichkeit, eine Komponente mit einem anderen TemplateUrl jedes Mal zu laden. Ich habe versucht, ComponentFactoryResolver oder ngComponentOutlet aber vergeblich zu betrachten.

Ich habe auch versucht, es mit innerHtml zu tun, aber meine benutzerdefinierte Code darin wurde nicht von Angular kompiliert, so dass bedeutet, dass keine Anweisung würde nicht gebunden werden.

Hat jemand eine Lösung?

Ich verwende die neueste Version von Angular (4).

+0

Überprüfen Sie immer doc: https://angular.io/docs/ts/latest/cookbook/dynamic-component-loader.html – wannadream

+0

http://stackoverflow.com/questions/40060498/angular-2-1-0 -create-child-component-on-the-fly-dynamisch/40080290 # 40080290 – yurzui

+0

Wie ich in meinem Beitrag gesagt habe, habe ich bereits ComponentFactoryResolver versucht und es hat nicht geholfen, aber danke :) – NhlstcR

Antwort

0

Ok, ich habe es geschafft. Alles scheint gut zu funktionieren.

Also verwende ich compileModuleAndAllComponentsAsync (wie es hier gemacht wird: https://github.com/patrikx3/angular-compile).

Und um meine Komponenten und Direktiven in den kompilierten Elementen bindbar zu machen, habe ich sie einfach in der declarations der NgModule erstellt, um meine Elemente zu kompilieren.

private async createFactory(opts: CompileOptions) { 
    const cacheKey = opts.template; 

    if (Object.keys(cache).indexOf(cacheKey) > -1) { 
    return cache[cacheKey]; 
    } 
    cache[cacheKey] = new Promise(async(resolve) => { 
    @Component({ 
     template: opts.template 
    }) 
    class TemplateComponent { 
     context: any 
    } 
    @NgModule({ 
     imports: opts.imports, 
     declarations: [ 
      TemplateComponent 
      // <== Insert your directives and components here 
     ] 
    }) 
    class TemplateModule { 
    } 
    const component = await this.compiler.compileModuleAndAllComponentsAsync(TemplateModule); 
    const factory = component.componentFactories.find((comp) => 
     comp.componentType === TemplateComponent 
    ); 
    if (opts.onCompiled) { 
     opts.onCompiled(component); 
    } 
    cache[cacheKey] = factory; 

    resolve(factory); 
    }) 
    return cache[cacheKey]; 
} 

Vielen Dank an alle!

0

Es gibt einen schönen Artikel über Winkel Website dazu:

https://angular.io/docs/ts/latest/cookbook/dynamic-component-loader.html

nur, dass alles für die neue Deklaration der Komponente gleich bleiben, nur müssen Sie einen zusätzlichen Eintrag in entryComponent machen für jeden neue Komponente in der gleichen Moduldatei hinzugefügt, in dem die neue Komponente deklariert wird:

entryComponents: [ HeroJobAdComponent, HeroProfileComponent ],

und dann mit ComponentFactoryResolver Sie können dynamicall y lade diese Komponente. Bitte lassen Sie mich wissen, wenn Sie weitere Hilfe benötigen.

+0

Danke für deine Hilfe, aber ich benutze das schon und leider löst es mein Problem nicht . Was ich brauche, ist dynamisch eine Unzahl von Vorlagen aufzurufen, ich kann sie nicht alle auflisten. – NhlstcR

+0

auch wenn Sie Unendlichkeit der Vorlagen auflisten, Deklaration ist am meisten ... zusammen mit der Deklaration, ein Eintrag soll in der Eintragskomponente in demselben Modul gemacht werden. Für jetzt wissen keine andere Annäherung, um Komponente dynamisch zu laden ... lassen Sie uns wissen, wenn Sie eine andere Lösung erhalten, wird es lieben, es zu wissen. – Lambo14

Verwandte Themen