2016-10-15 28 views
5

Các thành phần bậc cao hơn (HOC) là một mô hình phổ biến trong cộng đồng React. Xem this article nếu bạn không biết HOCCách tạo các thành phần bậc cao hơn trong Angular 2

Chúng có ý nghĩa gì trong Angular 2? Cách tạo HOC? Bất kỳ ví dụ nào?

+0

Có thể những điều này có thể giúp: https://angular.io/docs/ts/latest/cookbook/dynamic-form.html, http://mean.expert/2016/05/14/angular-2 -container-component/ – Sasxa

+0

Câu hỏi ở trạng thái hiện tại đòi hỏi phải có hiểu biết tốt về cả Phản ứng và Góc 2. Giải thích chính xác bạn muốn làm gì mà không sử dụng thuật ngữ HOC sẽ tăng cơ hội nhận được câu trả lời có chất lượng. – estus

Trả lời

1

Tôi cũng rất quan tâm đến một cái gì đó tương tự như HOC (Recompose như trong Angular 2). Gần đây tôi đã cố gắng tạo ra một tương tự để mapToProps HOC 'Recompose for Angular - mapToInputs sử dụng chỉ thị cấu trúc Angular. Tôi đang tìm cách tiếp cận tốt hơn.

@Component({ 
    selector: 'user-list', 
    template: ` 
     <h2>{{status}} users</h2> 
     <div *ngFor="let item of data">{{item}}</div> 
    ` 
    }) 
    export class UserList { 
    @Input() data: Array<any>; 
    @Input() status: string; 
    } 

    @Directive({selector: '[mapInputs]'}) 
    export class MapInputs { 
    component; 

    @Input() set mapInputsComponent(component) { 
    this.component = component; 
    } 

    @Input() set mapInputs(fn) { 
     this.vc.clear(); 
     let factory = this.componentFactoryResolver.resolveComponentFactory(this.component); 
     let componetRef = this.vc.createComponent(factory); 

     let inputs = fn(); 
     console.log(inputs); 
     Object.entries(inputs).forEach(([key, value]) => { 
     componetRef.instance[key] = value; 
     }); 
    } 

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

    @Component({ 
    selector: 'my-app', 
    template: ` 
     <div> 
     <button (click)="doubledata()">Doubel Data</button> 
     <div *mapInputs="filterBy.bind(null, {data:data, status:'active'}); component: component"></div> 
     <div *mapInputs="filterBy.bind(null, {data:data, status:'passive'}); component: component"></div> 
     <div *mapInputs="filterBy.bind(null, {data:data, status:'blocked'}); component: component"></div> 
     </div> 
    `, 
    }) 
    export class App { 
    name: string; 
    component = UserList; 
    data = ['active', 'active', 'passive', 'blocked', 'blocked']; 
    filterBy = (context) => { 
     return { 
      status: context.status, 
      data: context.data.filter(el => el === context.status); 
     }; 
    } 

    doubledata(){ 
     this.data = this.data.concat(this.data); 
    } 

    constructor() { 
     this.name = `Angular! v${VERSION.full}` 
    } 
    } 
+0

Dường như một cách tiếp cận tốt. Có vẻ như Angular không cho phép bạn "tự nhiên" làm điều đó ... Bạn đang sử dụng cách tiếp cận này cho chính mình Julia? –

+1

đây là hai loại HOC. Proxy đạo cụ HOC có thể tạo ra với góc cạnh nhưng nghịch đảo Invert - tôi không có ý tưởng làm thế nào để làm điều đó với góc với AOT. Tôi thực sự thích ý tưởng của HOC trong phản ứng và bỏ lỡ nó trong góc cạnh. –

Các vấn đề liên quan