Tôi đang cố gắng đạt được một cái gì đó như thế này: Tôi có một lớp mô hình được gọi là ObjectTypeA
, ObjectTypeB
và ObjectTypeC
. Ngoài ra còn có một nhà máy ComponentFactory
, mà dựa trên các loại của đối tượng thông qua năm sẽ tạo ra các thành phần khác nhau:Mẫu động "chuyển đổi" trong Angular2
ComponentFactory.ts
export interface ComponentFactoryInterface {
static CreateComponent(obj: CommonSuperObject)
}
@Injectable()
export class ComponentFactory {
public static CreateComponent(obj: CommonSuperObject){
if (obj instanceof ObjectTypeA){
return ObjectComponentA()
}else if (obj instanceof ObjectTypeB){
return ObjectComponentB()
}
}
}
Trong mẫu tôi muốn làm một cái gì đó như thế này:
main_template.html
<components>
<component *ngFor="#obj in objects">
<!-- insert custom component template here -->
</component>
</components>
Làm cách nào để chèn linh kiện được liên kết động?
tôi có thể làm một cái gì đó như thế này (không phải là cách ưa thích của tôi để làm việc đó):
<components>
<!-- loop over component models -->
<custom-component-a *ngIf="models[i] instanceof ObjectTypeA">
</custom-component-a>
<custom-component-b *ngIf="models[i] instanceof ObjectTypeB">
</custom-component-b>
</components>
Nhưng đây là dường như thực sự không đúng với tôi trên nhiều cấp độ (tôi sẽ phải thay đổi mã này và mã máy nếu tôi thêm một loại thành phần khác).
Edit - Working Ví dụ
constructor(private _contentService: ContentService, private _dcl: DynamicComponentLoader, componentFactory: ComponentFactory, elementRef: ElementRef){
this.someArray = _contentService.someArrayData;
this.someArray.forEach(compData => {
let component = componentFactory.createComponent(compData);
_dcl.loadIntoLocation(component, elementRef, 'componentContainer').then(function(el){
el.instance.compData = compData;
});
});
}
'ngSwitch' không phải là một tùy chọn,' DynamicComponentLoader' âm thanh giống như những gì tôi đang tìm kiếm. Tôi sẽ xem xét điều đó và lấy lại cho bạn. –
Phew! Hầu như ở đó, tôi chỉ cần thiết lập một thuộc tính trên thành phần mới được tạo ra. Tôi nhận được lời hứa với 'ComponentRef' trở lại nhưng tôi không thực sự chắc chắn làm thế nào để truy cập tài sản của thành phần mới được nạp ... Bất kỳ ý tưởng? (Cập nhật câu hỏi của tôi cho bạn để xem những gì tôi đang làm việc) –
Được rồi, tôi nghĩ rằng cá thể thành phần sẽ là 'el.instance'. Hãy thử điều đó và sớm trả lời bạn. –