2017-06-15 2 views
1

J'ai un problème étrange.Angulaire 2 Matériau - Pourquoi mon entrée est-elle désélectionnée?

J'utilise angulaire CLI et j'ai ajouté Matériel 2 à elle. J'ai créé quelques entrées avec ngfor et les ai liées à ngmodel. Tout fonctionne bien.

Mais chaque fois que je tape quelque chose, l'entrée est désélectionnée.

Voici le code HTML du composant:

<md-input-container class="treatments" *ngFor="let t of treatment; let i = index"> 
    <input mdInput placeholder="treatment {{ i + 1 }}" 
     value="{{ t[i] }}" name="treatment_{{ i + 1 }}" [(ngModel)]="treatment[i]"> 
</md-input-container> 

Lorsque je supprime le ngmodel, il ne fonctionne à 100%.

+0

Pouvez-vous montrer comment le traitement ressemble? – Nehal

+0

@Nehal Il ressemble à ["traitement 1", "traitement 2", "etc ..."] Cest ... (pas une question pertinente - comment je peux changer mon nom de la version mobile de débordement de la pile -). Merci – TheSnake620

+0

@ TheSnake620 Comment cela s'est-il jamais passé avec l'une ou l'autre des réponses fournies? :) – Alex

Répondre

0

Vous itérez un tableau de type primitif, et donc ils sont comparés par valeur. Lorsque vous modifiez un traitement (par exemple t), toutes les valeurs sont détruites et de nouvelles créées, ce qui entraîne une perte de focus du champ. Cela peut être résolu en utilisant trackBy, qui suit les traitements par l'index et ne fait que détruire et recrée le traitement que vous modifiez.

Alors ajoutez trackBy:

<md-input-container class="treatments" *ngFor="let t of treatment; 
    let i = index; trackBy:trackByFn"> 

et TS ajouter la fonction:

trackByFn(index, treatment) { 
    return index; 
} 
0

Le problème est que vous essayez de lier ngModel aux valeurs primitives. Vous pouvez résoudre le problème de désélection en ajoutant @Input() avant la déclaration treatment.

@Input() treatment: string[] = [ "treatment 1", "treatment 2"]; 

Mais il ne mettra pas à jour les valeurs dans le tableau. Si vous souhaitez mettre à jour les valeurs, ngModel doit être lié à la propriété de l'objet. J'ai ajouté les deux exemples dans ce Plnkr.

Pour plus d'informations, reportez-vous cette question SO Angular2 ngModel inside of ngFor

+0

Je ne vois vraiment pas pourquoi vous avez mentionné '@ Input' car la question n'est pas de transmettre des données via des composants ... De toute façon, il vaut la peine de mentionner que' value = "{{t [i]}}" ' est également un problème, il était en conflit avec 'ngModel' là. – developer033

+0

@Nehal Your Way n'a pas fonctionné, je dois utiliser trackBy, BTW Merci pour votre aide :). – TheSnake620