J'essaie de charger un composant Angular 2 de façon récursive avec un tableau récursif (plunk: http: // plnkr .co / edit / 3npsad? p = preview).

Étant donné ce tableau récursif:

[
  {
    "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"
      }
    ]
  }
]

J'ai besoin de la sortie suivante:

<my-item>
    <div id="1" text="abc"></div>
</my-item>
<my-item>
    <div id="2" text="def"></div>
    <my-item>
        <div id="21" text="def-1"></div>
        <my-item>
            <div id="211" text="def-1-1"></div>
        </my-item>
        <my-item>
            <div id="212" text="def-1-2"></div>
        </my-item>
    </my-item>
    <my-item>
        <div id="22" text="def-2"></div>
    </my-item>
</my-item>

Je ne pouvais que rendre le premier niveau d'entrée comme indiqué dans mon plunk. Comment puis-je faire itérer mon composant récursivement pour rendre la sortie souhaitée? Le tableau d'entrée peut contenir n'importe quel nombre d'éléments et d'imbrication.

Merci!

1
Niner 8 août 2016 à 07:49

3 réponses

Meilleure réponse

mettre à jour

Avec l'introduction de @NgModule et la migration de directives vers @NgModule forwardRef ne devrait plus être nécessaire.

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 est requis car la classe ItemComponent est référencée avant d'être déclarée.

Exemple Plunker

0
Günter Zöchbauer 16 sept. 2016 à 07:22

Voici quelque chose pour commencer. Vous devez implémenter vous-même la fonction de retour HTML:

  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) {

}
-1
rnli 8 août 2016 à 05:01

Je créerais votre composant de cette façon:

@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;
}

Et appelez-le le composant d'un autre composant et fournissez les données complètes du composant:

@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
Thierry Templier 8 août 2016 à 05:59