![](/img/trans.png)
[英]How to know WHEN a dynamically created Angular component is available to request in the DOM?
[英]Angular 2: how to use the data passed to component when dynamically created inside component itself
當動態添加組件時,我使用了以下示例Angular 2將數據傳遞給組件 ,由於它,我能夠在子組件模板中看到值dataToPass
(從父項傳遞到動態創建的子項),但是我無法在子組件構造函數中獲取屬性,以便對其進行修改。
你有一個如何做的想法嗎?
你可以看到我的普拉克這里和我下面的代碼:
//our root app component
import {
NgModule,
Input,
ComponentRef,
Injectable,
Component,
Injector,
ViewContainerRef,
ViewChild, ComponentFactoryResolver} from "@angular/core";
import {BrowserModule} from '@angular/platform-browser'
import {Subject} from 'rxjs/Subject';
@Injectable()
export class SharedService {
showModal:Subject<any> = new Subject();
}
@Component({
selector: 'comp-comp',
template: `MyComponent dataToPass: {{dataToPass}}, dataToPass2: {{dataToPass2}}`
})
export class CompComponent {
dataToPass2;
constructor() {
this.dataToPass2 = this.dataToPass+' hello';
}
}
@Component({
selector: 'child-component',
template: `
<button (click)="showDialog()">show modal from child</button>
`,
})
export class ChildComponent {
constructor(private sharedService:SharedService) {}
showDialog() {
this.sharedService.showModal.next({'type': CompComponent, 'title': 'titolo2', 'dataToPass': 'dataToPass'});
}
}
@Component({
selector: 'modal-comp',
template: `
<div class="modal fade" id="theModal" tabindex="-1" role="dialog" aria-labelledby="theModalLabel">
<div class="modal-dialog largeWidth" role="document">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">{{theHeader}}</h4></div>
<div class="modal-body" #theBody>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal" (close)="close()">Close</button>
</div></div></div></div>
`
})
export class ModalComponent {
@ViewChild('theBody', {read: ViewContainerRef}) theBody;
theHeader: string = '';
dataToPass: string = '';
cmpRefBody:ComponentRef<any>;
constructor(
sharedService:SharedService,
private componentFactoryResolver: ComponentFactoryResolver,
injector: Injector) {
sharedService.showModal.subscribe(data => {
if(this.cmpRef) {
this.cmpRef.destroy();
}
let factory = this.componentFactoryResolver.resolveComponentFactory(data.type);
this.cmpRef = this.theBody.createComponent(factory);
this.cmpRef.instance.dataToPass = data.dataToPass;
this.dataToPass = data.dataToPass;
this.theHeader = data.title;
console.log(data.title);
console.log(data.dataToPass);
$('#theModal').modal('show');
});
}
close() {
if(this.cmpRef) {
this.cmpRef.destroy();
}
this.cmpRef = null;
}
}
@Component({
selector: 'my-app',
template: `
<div>
<h2>Hello</h2>
<button (click)="showDialog()">show modal</button>
<child-component></child-component>
</div>
`,
})
export class App {
constructor(private sharedService:SharedService) {}
showDialog() {
this.sharedService.showModal.next({'type': CompComponent, 'title': 'titolo1', 'dataToPass': 'dataToPass'});
}
}
@NgModule({
imports: [ BrowserModule ],
declarations: [ App, ModalComponent, CompComponent, ChildComponent],
providers: [SharedService],
entryComponents: [CompComponent],
bootstrap: [ App, ModalComponent ]
})
export class AppModule{}
創建組件時將執行構造函數,這是在分配值之前執行的。 您可以將其設置為在傳遞新值時能夠執行代碼的設置器:
export class CompComponent {
private _dataToPass2;
get dataToPass2() {
return this._dataToPass2;
}
set dataToPass2(value) {
this._dataToPass2 = value + 'hello';
}
}
感謝Gunter的建議,我得以找到解決方案。
export class CompComponent {
dataToPass2;
ngAfterContentInit() {
this.dataToPass2 = this.dataToPass + ' hello';
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.