web-dev-qa-db-fra.com

Ionic 2 / angular 2 - Comment ajouter des éléments HTML avec TypeScript à mon composant?

S'il vous plaît ne détestez pas juger par le titre, lisez d'abord le message.

Je viens de commencer à apprendre TypeScript et angular 2 en travaillant avec le cadre ionic 2).

J'ajoute l'élément html référençant la variable typscript "newItem", comme ceci:

<ion-content>
  <ion-list inset>
    <ion-item *ngFor="let item of todos" (click)="edit(item)">
      {{item}}
    </ion-item>
    <ion-item>test</ion-item>
    <div [innerHTML]=newItem></div>
  </ion-list>
</ion-content>

Dans ma classe TypeScript pour le composant, j'ai une fonction addTodo (), qui définit le code HTML pour "newItem" lorsque l'icône plus/ajouter dans le coin droit est enfoncée:

  addTodo(){
    this.newItem = "<ion-item>test</ion-item>";
  }

Pour une raison quelconque, la balise "ion-item" est ignorée lors de la compilation et n'insère que "test" dans l'élément div.

L'appliction ressemblera à ceci:

enter image description here

Classe de composants:

enter image description here

J'ai donc essayé d'ajouter ceci à la vue:

<form *ngIf="editedItem">
  <ion-item><input [(ngModel)]="newItem" name="newItem">
    <ion-buttons end>
      <button ion-button color="danger" (click)="btnCancel()">Cancel</button>
      <button ion-button color="secondary" (click)="btnAdd()">Add</button>
    </ion-buttons>
  </ion-item>
</form>

Mais maintenant, lorsque je clique sur annuler ou ajouter, la page doit être rechargée. Je sais que je fais quelque chose de mal avec la [(ngModel)] = "newItem", dois-je essayer de passer la variable Angular au modèle ou y a-t-il une meilleure façon de le faire .

edit: passé la variable à la fonction (clic), comme on le voit dans la réponse de @JoeriShoeby ci-dessous.

Dans le modèle:

export class TodosPage {

newItem = "";
todos: string[] = this.getTodos();
editedItem: boolean = false;

  constructor(public navCtrl: NavController) {

  }

  addTodo(){
    this.editedItem = true;
  }

  btnAdd(){
    this.todos.Push(this.newItem);
    this.editedItem = false;
  }

  btnCancel(){
    this.editedItem = false;
  }

  getTodos(): string[]{

    return ["item 1", "item 2"];
  }
}
8
Kevin Frostad

Votre fichier HTML

// Your plus-icon in your header bar
<button (click)='toggleNew == true'>
    <ion-icon name='plus'></ion-icon>
</button>

// Your content
<ion-content>

  <ion-list inset>
    <ion-item *ngFor="let item of todos" (click)="edit(item)">
      {{item}}
    </ion-item>
  </ion-list>

    <ion-item *ngIf='toggleNew'>
        <ion-input [(ngModel)]='newItem' placeholder="Task .. "></ion-input>
        <button (click)='saveNew(newItem)'>Save</button>
        <button danger (click)='cancelNew()'>Cancel</button>
    </ion-item>
</ion-content>

Votre composant

// Initalial values.
newItem: string = "";
toggleNew: boolean = false;

// Saving function
saveNew( newItem: string ): void {
    this.todos.Push(newItem);
    this.toggleNew = false;
    this.newItem = "";
}

// Cancel function
cancelNew(): void {
    this.toggleNew = false;
    this.newItem = "";
}
4
JoeriShoeby