2015-12-16 21 views
5

Prendere in considerazione la seguente esempio:angular.copy quando array ha proprietà personalizzata

var ar = [4, 2, 3]; 
ar.$x = 'something'; 
var br = angular.copy(ar); 
console.dir(br); 

br non hai $x proprietà più, perché quando la copia matrice, itera angolari con for (;;;) che non vede proprietà personalizzate (se iterata con for in quindi funzionerebbe).

Quale di seguito devo fare?

  1. Creare una matrice come classe e quindi assegnare una proprietà;
  2. Se si tratta di bug, riportare su angolare;
  3. Modificare il mio codice, perché l'assegnazione di proprietà all'array non è una buona pratica;
+0

Perché sei Assegnazione di un immobile alla matrice? Questo aiuterà a decidere se 3 è vero. – sdgluck

+0

@sdgluck Sto assegnando la proprietà '$ modified' all'array se qualcosa è cambiato. – karaxuna

risposta

5

Prova angular.merge() Si tratta di una copia completa che include le proprietà enumerabili.

var ar = [4, 2, 3]; 
ar.$x = 'something'; 
var br = angular.merge([], ar); 
console.dir(br); 

uscita

Array[3] 
    0: 4 
    1: 2 
    2: 3 
    $x: "something" 
    length: 3 
    __proto__: Array[0] 
+2

L'odio per rovinare il buonumore, ma 'unire() 'fa ** non ** fare una copia profonda, semplicemente estende' br' con 'ar'. Se in seguito cambi 'ar', dì 'ar.y =' x'' allora' br' manterrà 'y: 'x'' troppo. Prova di concetto -> ** http: //plnkr.co/edit/idH8tKqRb2zGXT817UvV? P = anteprima ** – davidkonrad

+1

** Buona cattura **. Il mio desiderio di abbinare l'esempio OPs ha comportato l'omissione del nuovo array in cui fondersi. Ho aggiornato la risposta con il codice corretto. 'var br = angular.merge (ar)' dovrebbe essere 'var br = angular.merge ([], ar)'. POC aggiornato -> http://plnkr.co/edit/UOGX1CpoOfr0QA4YqNda?p=preview. –

+0

Alla fine ho cambiato il mio codice, ma ho segnato questa risposta perché risolve il problema che è in questione. – karaxuna

2

Penso che non sia un problema angolare. Se si chiama una tale affermazione:

ar.$x = 'something'; 
console.log(Object.prototype.toString.call(ar)); 

Vedrete che [object Array] sarà registrata. Ecco come funziona il metodo Array.isArray() e, a sua volta, è così che il metodo angolare copy() decide come iterare attraverso l'entità passata come argomento. Questo rilevamento è cruciale in quanto il ciclo for ... in su un array può creare confusioni in altri casi. Ecco spiegato perché: Why is using "for...in" with array iteration a bad idea?

Ti consiglierei di cambiare il codice, in questo caso particolare.

1

Prova utilizzando jQuery:

jQuery.extend ([], ar);

var ar = [4, 2, 3]; 
ar.$x = 'something'; 
var br = jQuery.extend([], ar); 
console.dir(br); 
Problemi correlati