2017-01-28 3 views
5

Ich arbeite mit Angular 2 mit TypeScript. Ich habe eine Benutzerverwaltungskomponente, wo ich eine Tabelle für ganze Benutzer habe.Klonen von Objekten TypeScript

Wenn auf einen Benutzer in der Tabelle geklickt wird, werden Formulare mit allen Eigenschaften bearbeitet. Ereignis Benutzer die Wahl erfolgt wie folgt:

onUserSelected(event) { 
     var selectedId = event.data.id; 
     this.selectedUser = this.users.filter(user => user.id === selectedId)[0] 
    } 

Das Problem ist, wenn selectedUser ändert sich auch seine Eigenschaften bearbeitet wird in der Tabelle und es tut so gut aussehen. Ich versuchte, mich zu erstellen zu kopieren, wie unten, aber es hat nicht geholfen - Benutzerklasse

clone() { 
     var cloned = new User(this.id, this.login, this.name, this.surname, this.phone); 
     return cloned; 
    } 

Vielleicht ich etwas tue, die in Angular2 keine gute Praxis ist?

+0

, was das Problem ist, dass Sie konfrontiert sind – Aravind

+0

einige bereits gestellte Frage Versuchen Sie, auf Stackoverflow http://stackoverflow.com/questions/28150967/typescript-cloning-object –

Antwort

13

Try

this.user = Object.assign({}, currentObject); 

Wie @AngularFrance erwähnt, dass dies nur für Flach Kopieren von Objekten wird mit arbeiten, sucht eine andere Implementierung, wenn ein Bedarf da ist, um ein Objekt tief zu kopieren.

+1

Randnotiz: 'Object.assign()' ist für flache Kopien (NICHT tiefe Kopien), die im Falle dieser Frage funktionieren sollten. – AngularChef

+0

Sie haben Recht, bearbeitet. – Amit

+5

Für tiefe Kopien gibt es immer die umstrittene 'obj = JSON.parse (JSON.stringify (o));' – AngularChef

4

Sie können Ihr Editorformular an ein leeres Benutzerobjekt binden, z. B. editUser, anstelle der selectedUser Variable (die auf ein Element Ihrer Benutzersammlung verweist). In Ihrem onUserSelected(event), würden Sie editUser durch Klonen der veränderbaren Eigenschaften der ausgewählten Benutzerobjekte initialisieren. Nach dem Senden des Bearbeitungsformulars ((ngSubmit)="editSubmit()") ersetzen Sie die ursprünglichen Eigenschaften im ausgewählten Benutzerobjekt in der Benutzersammlung.

Etwas entlang der Linien von:

editUser: User = new User(); 
selectedId: number; 
selectedUser: User; 

onUserSelected(event) { 
    this.selectedId = event.data.id; 
    this.selectedUser = this.users.filter(user => user.id === this.selectedId)[0]; 
    this.editUser = this.simpleClone(this.selectedUser); 
} 

editSubmit(event) { 
    this.selectedUser = this.simpleClone(this.editUser); 
} 

simpleClone(obj: any) { 
    return Object.assign({}, obj); 
} 

Die simpleClone Implementierung ist für tiefes Klonen nicht geeignet, so dass, wenn Ihre Benutzerobjekte Verweise auf andere Objekte halten, soll dies in eine richtige Klonfunktion gedreht werden.

Verwandte Themen