Recursive component loading with recursive array

后端 未结 3 770
南方客
南方客 2021-01-23 15:11

I\'m trying to load an Angular 2 component recursively with a recursive array (plunk: http://plnkr.co/edit/3npsad?p=preview).

Given this recursive array:



        
相关标签:
3条回答
  • 2021-01-23 15:18

    update

    With the introduction of @NgModule and the migration of directives to @NgModule forwardRef shouldn't be necessary anymore.

    original

    <my-item *ngFor="let itm of items" [id]="itm.id" [text]="itm.text" [items]="itm.items" >
    </my-item>
    
    @Component({
      selector: 'my-item',
      styles: ['div {padding-left: 32px;}']
      providers: [],
      template: `<div>{{id}} - {{text}}
        <my-item *ngFor="let itm of items" [id]="itm.id" [text]="itm.text" [items]="itm.items" >
        </my-item>
        </div>
    
      `,
      directives: [forwardRef(()=> ItemComponent)]
    })
    export class ItemComponent {
      @Input() id: string;
      @Input() text: string;
      @Input() items: any[];
      constructor() {
      }
    }
    

    forwardRef is required because the class ItemComponent is referenced before it is declared.

    Plunker example

    0 讨论(0)
  • 2021-01-23 15:27

    Heres something to get your started. You need to implement the HTML returning function yourself:

      var a = [
      {
        "id": 1,
        "text": "abc"
      },
      {
        "id": 2,
        "text": "def",
        items: [
          {
            "id": 21,
            "text": "def-1",
            items: [
              {
                "id": 211,
                "text": "def-1-1"
              },
              {
                "id": 212,
                "text": "def-1-2"
              }
            ]
          },
          {
            "id": 22,
            "text": "def-2"
          }
        ]
      }
    ];
    
    function iterateRecursive(array) {
        for(var i = 0; i < array.length; i++) {
        if(array[i].items) {
            console.log(array[i].text);
          //uncomment: printHtml(array[i].id, array[i].text);
            iterateRecursive(array[i].items)
        } else {    
            console.log(array[i].text);         
        }
    
      }
    }
    
    
    iterateRecursive(a);
    
    //implement this function that takes an id and text and returns html
    //call it in place of console log
    function printHtml(id, text) {
    
    }
    
    0 讨论(0)
  • 2021-01-23 15:36

    I would create your component this way:

    @Component({
      selector: 'my-item',
      template: `
        <div id="data.id" text="data.def"></div>
        <my-item *ngFor="let item of items" [data]="item"></my-item>
      `
    })
    export class MyItemComponent {
      @Input() data: any;
    }
    

    and call it the component from another component and provide the whole component data:

    @Component({
      selector: 'other-comp',
      template: `
        <my-item [data]="data" *ngFor="let data of wholeData"></my-item>
      `
    })
    export class OtherComponent {
      wholeData = [
        {
          "id": 1,
          "text": "abc"
        },
        (...)
      ];
    }
    
    0 讨论(0)
提交回复
热议问题