2016-10-28 11 views
15

Mam następujący jsfiddle

Chcę być w stanie trzymać mój własny komponent do określonej sieci (na przykład „”)

Teraz bez Angular2, po prostu użyć:

var el = $.parseHTML("<div><div class=\"grid-stack-item-content\" data-id=\""+id+"\"/><div/>"); 
this.grid.add_widget(el, 0, 0, 6, 5, true); 

problem jest, nie mam pojęcia, jak mógłby zrobić coś takiego:

var el = $.parseAndCompileHTMLWithComponent("<div><div class=\"grid-stack-item-content\" data-id=\""+id+"\"/><fancy-button></fancy-button><div/>"); 
this.grid.add_widget(el, 0, 0, 6, 5, true); 

w gular1, wiem, że istnieje kompilacja, ale w kanale 2 nie ma czegoś takiego.

Moja wyobraźnia przycisk składnikiem jest prosta i brzmi następująco:

@Component({ 
    selector: 'fancy-button', 
    template: `<button>clickme</button>` 
}) 
export class FancyButton {} 

Jak można dynamicznie dodać komponent fantazyjne przyciskami?

+1

http: // stackoverflow.com/questions/34784778/equivalent-of-compile-in-angleular-2/37044960 # 37044960 –

+0

Nie jestem pewien, czy rozumiem, co próbujesz zrobić. w tej chwili obsługuje tylko kątownik 1. – Avi

Odpowiedz

4

easist sposób dodać fancy-button komponent dynamicznie może być następująca:

1) Dodaj komponent do entryComponents Tablica modułu

@NgModule({ 
    imports:  [ BrowserModule ], 
    declarations: [ AppComponent, GridStackComponent, FancyButtonComponent ], 
    entryComponents: [ FancyButtonComponent ], // <== here 
    bootstrap: [ AppComponent ] 
}) 
export class AppModule { } 

2) Pobierz węzeł główny ze skompilowanego komponentu

constructor(private vcRef: ViewContainerRef, private componentFactoryResolver: ComponentFactoryResolver) { } 

getRootNodeFromParsedComponent(component) { 
    const componentFactory = this.componentFactoryResolver.resolveComponentFactory(component); 
    const ref = this.vcRef.createComponent(componentFactory, this.vcRef.length, this.vcRef.injector); 
    const hostView = <EmbeddedViewRef<any>>ref.hostView; 
    return hostView.rootNodes[0]; 
} 

3) Użyj go nigdzie

const fancyBoxElement = this.getRootNodeFromParsedComponent(FancyBoxComponent); 
$('#someId').append(fancyBoxElement); 

Oto Plunker Example Twoim przypadku

Jeśli szukasz czegoś bardziej skomplikowanego to istnieje wiele odpowiedzi, gdzie można użyć kompilatora kątowego, aby to zrobić działa

+0

@yuzui Próbowałem tego przykładu, otrzymuję ** this.componentFactoryResolver.resolveComponentFactory nie jest funkcją ** error – deen

+0

@rish Czy możesz podać trochę plunkera? – yurzui

+0

@yuzui thnx do odpowiedzi, https://plnkr.co/edit/EPYcF3qFEkYhc12WVEeD?p=preview – deen

1

Należy użyć klasy ViewContainerRef Angular 2, która zapewnia przydatną metodę createComponent. ViewContainerRef można nieformalnie myśleć o lokalizacji w DOM, gdzie można wstawiać nowe komponenty.

this.cmpRef = this.vcRef.createComponent(factory, 0, injector, []); 

Here's a working plunker example.

Albo można użyć rodzajowego outlete HTML z this post

+0

Istnieje wiele wątków DynamicComoponentLoader, ale te odpowiedzi nie są istotne, ponieważ zostały wycofane. – tottomotto

Powiązane problemy