Co usiłuję zrobić
Pracuję na systemie głos, który zostanie ponownie wykorzystany w wielu komponentów na całym stronie. Aby zachować suchość, chcę utworzyć komponent głosowania z dowolnego komponentu, do wyznaczonego elementu DOM. Po utworzeniu składnika należy ustawić zmienne instancji (w tym przypadku model:string
i pk:number
, oba publiczne).NG4 componentFactory umieszczenie go w docelowej DOM
wynik Oczekiwany
Spodziewam składnik być wykonane w wyznaczonym miejscu, drukowanie odpowiednich danych, które zostały tuż po fabryka stworzyła komponent. Wyjście na dole głosów powinna być Model: project PK: 1
rzeczywista sytuacja
ComponentFactory obecnie dwa wyjść składowej głosowania utworzonego przez komponent fabryczne:
Na właściwym miejscu (ukierunkowane div), ale bez ustawionych zmiennych instancji.
U dołu strony, ale jest to inny problem, w późniejszym czasie i na inny temat.
Niektóre kod
@NgModule({
..
declarations: [
AppComponent,
ProjectComponent, // parent for voteContainer
VoteComponent, // Dynamic component
],
entryComponents: [
VoteComponent,
], ..
})
składnikiem dominującym zawierający fabrykę VoteComponent
export class ProjectDetailComponent implements AfterViewInit {
@ViewChild('voteComponentContainer', {read: ViewContainerRef}) voteComponentContainer;
public ngAfterViewInit() {
this.factoryVoteComponent();
}
private factoryVoteComponent() {
const voteComponentFactory = this.componentFactoryResolver.resolveComponentFactory(VoteComponent);
const voteComponentRef = this.viewContainerRef.createComponent(voteComponentFactory);
voteComponentRef.instance.model = "project";
voteComponentRef.instance.pk = 1;
voteComponentRef.changeDetectorRef.detectChanges();
}
}
Dynamiczny cel komponent:
<vote-component-container></vote-component-container>
podstawowy składnik głosowanie
@Component({
selector: 'vote-component-container',
templateUrl: 'vote.component.html',
})
export class VoteComponent {
public model:string;
public pk:number;
public constructor(){}
}
Co Próbowałem
mam zmaga się z tym przez jakiś czas teraz, więc nie są dość pewne próby zmusić go do pracy. Ostatnia próba to z utworzeniem ViewChild dla fabryki.
Poza tym, ja już zostały gry z nazwami, różne sposoby konfigurowania odbiornika szablon komponentu itp
Co chcę zapytać
Czy ktoś ma jakieś doświadczenia z wykorzystanie dynamicznych komponentów, jak w sytuacji, którą próbuję teraz? Miałem nadzieję, że pchnę we właściwym kierunku, jak rozwiązać kwestię renderowanego komponentu we właściwej lokalizacji, ale bez dostępnych atrybutów.
Jeśli zainicjujesz zmienne z wartością domyślną w komponencie VoteComponent, a następnie spróbujesz je ustawić po utworzeniu, czy to działa? np ---> public pk: number = 0; model publiczny: string = ''; <--- – diopside
Należy również pamiętać, że podczas tworzenia komponentów dynamicznych są one tworzone jako * rodzeństwo * w obiekcie ViewContainerRef służącym do ich umieszczania. Nie jako dziecko. Więc jeśli używasz ViewChild, aby umieścić je w elemencie component, zostanie on renderowany zaraz po tym kontenerze, a nie w nim. To spowodowało wiele zamieszania, kiedy po raz pierwszy zacząłem pracować w dynamicznych komponentach! – diopside