0
votes

Angulaire / Thypscript, un problème de variable

Il y a mon problème:

J'ai une fonction qui ajoutez un élément à un tableau (A), l'élément à ajouter provient de l'argument. Ensuite, lorsque je modifierai cet élément dans le tableau (A), il modifie également l'élément que j'ai utilisé comme argument. P>

Il ressemble à celui: P>

P>

addTemplates(nTemplate){
    let k = nTemplate;
    k.id=this.templates.length+1;
    this.templates.push(k);
    this.emitTemplateSubject();
  }
  
  //when I use the function:
  
  let aObject={id:1, sth:"aa", sthE:"bb"}
  addTemplate(aObject);
  
  
  //then  aObject.id is also change.


1 commentaires

La plupart des réponses que vous obtiendrez vous recommanderont de différentes façons de créer un clone peu profond de votre objet. En supposant que vos objets ne soient pas tous aussi simples que celui de votre question, vous seriez probablement mieux à regarder dans Clonage profond d'objets JavaScript . TL; DR: Dans mon opinion personnelle, Importation de Clonedeep () La méthode est la solution la plus simple et la plus robuste pour angulaire.


4 Réponses :


2
votes

Vous devez créer une copie de votre objet, puis l'envoyer à la fonction

let newObject = Object.assign({}, aObject);
addTemplate(newObject );


1 commentaires

Notez que lors de l'utilisation de l'opérateur de répression sur un objet comportant des objets comme des propriétés, ces objets seront référencés: const aobject = {enfant: {"propriété": "valeur"}}; const Spread = {... AObject}; répandre.child.property = "nouvelle valeur"; console.log (aobject.child.property === Spread.child.Property);



1
votes

avec this.templates.push (k); code>, vous ajoutez une référence, pas une copie, de k code> à modèles code>. Par conséquent, lorsque vous modifiez les propriétés de la référence dans le tableau, vous modifiez le même objet que lors de la modification directe k code>.

Un exemple simple qui montre la différence entre une référence et une copie (dans Ce cas, je crée une copie à l'aide de JSON.PARSE (JSON.Stringify (...)), que je ne recommanderais pas pour les projets réels réels): p>

p>

const original = {"property":"value"};
const reference = original;
const copy = JSON.parse(JSON.stringify(original));

const array = [reference, copy];

array[0].property = 'new value for reference';
array[1].property = 'new value for copy';

console.log(reference.property === original.property);
console.log(copy.property !== original.property);


0 commentaires

0
votes

Vous pouvez utiliser le Spread opérateur et avoir quelque chose comme: xxx


1 commentaires

Notez que lors de l'utilisation de l'opérateur de répression sur un objet comportant des objets comme des propriétés, ces objets seront référencés: const aobject = {enfant: {"propriété": "valeur"}}; const Spread = {... AObject}; répandre.child.property = "nouvelle valeur"; console.log (aobject.child.property === Spread.child.Property);



0
votes

Vous pouvez essayer quelque chose comme ci-dessous et utiliser Attribuer un mot-clé pour créer de nouveaux objets au lieu d'attribuer des réfractions.

let aObject = {
  id: 1, sth: "aa", sthE: "bb"
}
addTemplates(aObject);


function addTemplates(nTemplate) {
  let k  = Object.assign({}, nTemplate);
  k.id=this.templates.length+1;
  this.templates.push(k);
  this.emitTemplateSubject();
}


0 commentaires