2017-06-15 2 views
0

ich die folgen HTML haben:Angular Array.push() erzeugt ein Duplikat für ng-repeat

<div ng-repeat="contact in vm.contacts"> 
    <input type="text" ng-model="contact.firstName"> 
    <input type="text" ng-model="contact.lastName"> 
    <button ng-click="vm.addNew()">add</button> 
</div> 

und den folgenden Code auf meinem Winkelregler:

vm.contacts = []; 

vm.addNew = addNew; 

init(); 

function init() { 
    addNew(); 
} 

function addNew() { 
    vm.contacts.push({}); 
} 

Also, wenn die Seite gestartet wird, fügt der Controller dem Array vm.contacts ein leeres Objekt hinzu.

Mein Problem ist: sobald ich die Felder fülle und auf die Schaltfläche Hinzufügen klicke, statt einen Array-Eintrag mit einem leeren Objekt zu erstellen, verdoppelt eckig den vorherigen Array-Eintrag.

Also, wenn ich „John“ für Vornamen und „Smith“ für Nachnamen ein, und klicken Sie dann auf die Schaltfläche Hinzufügen, wird das resultierende Array sein:

[ 
    {firstName: "John", lastName: "Smith"}, 
    {firstName: "John", lastName: "Smith"} 
] 

Und das gleiche Kontakt wird zweimal angezeigt.

Wie verhindere ich dies?

Ich habe versucht, beide track by $index auf die ng-repeat Deklaration und angular.copy() auf die Funktion addNew zu verwenden, und nichts scheint zu funktionieren. Ich möchte in der Lage sein, einen neuen leeren Kontakt hinzuzufügen, den ich nicht replizieren oder duplizieren möchte.

Vielen Dank im Voraus!

+0

Ich hatte ein ähnliches Problem, das mit dem eckigen.copy() - [Dokumentationslink] (https://docs.angularjs.org/api/ng/function/angular.copy) –

+0

gelöst wurde Ich habe versucht um angular.copy() auf mindestens drei verschiedene Arten zu verwenden, konnte die Wiederholung jedoch nicht verhindern, @Kyle. :/ – Vinas

+0

Bitte fügen Sie einen Link zu der Plunkr Ihres aktuellen Codes in der ursprünglichen Post –

Antwort

2

Etwas wie folgt aus:

VIEW

<div ng-app="app" ng-controller="MainController as vm"> 

    {{vm.contacts}} 

    <div ng-repeat="contact in vm.contacts"> 
    <input type="text" ng-model="contact.firstName"> 
    <input type="text" ng-model="contact.lastName"> 
    <button ng-click="vm.addNew()">add</button> 
    </div> 

</div> 

CONTROLLER

angular 
    .module('app', []) 
    .controller('MainController', MainController) 


function MainController($timeout) { 

    var vm = this; 
    vm.contacts = [{}]; 

    vm.addNew = addNew; 

    function addNew() { 
     vm.contacts.push({}); 
    }  
} 

JSFIDDLE

+0

@Vinas Hilft dir immer noch? Weil ich nicht weiß, was die Absicht mit der 'addNew()' Methode ist. –

+0

Leider hat es @ daan.desmedt nicht funktioniert, ich bekomme immer noch ein Duplikat. Thjis ist eine dynamische Form. Sie können weitere Kontakte hinzufügen.Sobald Sie auf die Schaltfläche Hinzufügen klicken, sollte ein neues Array Item erstellt werden und die Eingabefelder sollten angezeigt werden. – Vinas

+0

Uh ... Können Sie bitte ein JSFiddle für mich erstellen - damit ich das Problem sehen kann? –

0

denke ich, das Problem hier entsteht :

<input type="text" ng-model="contact.firstName"> 
    <input type="text" ng-model="contact.lastName"> 

Sobald das Array der ersten und letzte Kontaktnamen empfängt, kann der Eingang nach dass nur der erste und Nachname in Kontakt gespeichert werden, wie die ersten Werte werden in Kontakt gespeichert werden und von dort kann auf nur verwenden diese Werte.

+0

Sollte es nicht interpretieren, dass "Kontakt" in diesem Zusammenhang bedeutet "vm.contacts [$ index]" ?? Ich habe jedoch versucht, 'ng-model =" vm.contacts [$ index] .firstName "' und es hat auch nicht funktioniert. – Vinas

+0

Sind Sie sicher, dass der $ Index aktualisiert wird? Ich denke, was passiert ist irgendwo das Array nimmt den ersten Wert als Eingabe eingegeben. Zum Beispiel, wenn Sie vm.addNew = addNew; dann wird jeder neue Mehrwert der erste neue Mehrwert sein. So sieht es für mich aus, aber ich kann Ihrem Code nicht weitgehend folgen. – liamguy165

+0

Ja @ liamguy165. Ich kann den $ index fine während der Schleife drucken. Es funktioniert auf Geige, es funktioniert nur nicht an meinem Projekt. Irgendwie ein Mysterium für mich:/ – Vinas

Verwandte Themen