2013-12-12 27 views
6

Sto provando a creare una funzione che generi una struttura ad albero in modo tale che ogni elemento contenga un riferimento all'elemento padre.Riferimento funzione ricorsiva Javascript this

Ho una funzione che si chiama quando si creano i bambini ma ci sono momenti difficili con esso, sembra che una volta che viene richiamato da sé this si riferisce ancora all'elemento di livello superiore anziché a quello corrente.

Registrazione per consolare l'elemento è possibile vedere che il genitore fa sempre riferimento al primo elemento della catena (o è assente) quando è più profondo del primo livello. Crea l'albero, ma i riferimenti al genitore vengono persi per gli elementi oltre al primo.

var Item = function (item, parent) { 
    console.log('item is :' + item.name); 
    this.parent = parent; 
    console.log('parent is: ' + parent); 
    var fields = _.union(_.keys(item), _.keys(this.parent)); 
    _.each(_.without(fields, ['parent','children']), function (prop) { 
    this[prop] = angular.isDefined(item[prop]) ? item[prop] : this.parent[prop]; 
    }, this); 

    this.children = []; 
    if (item.children) { 
    this.children = _.map(item.children, function (child) { 
     console.log('this is : ' + this); 
     return new Item(child, this) 
    }, this); 
    } 
}; 

var tree = new Item(root, {}); 

Avere un po 'di problemi a trovare un violino in corso, ma qui è un po' di dati di esempio:

var root = JSON.parse('{"id":"1","name":"root item","root":"1","lft":"1","rgt":"22","level":"1","type": 
"category","parent_id":"1","deadline":null, 
"children":[ 
{"id":"2","name":"item 1","root":"1","lft":"14","rgt":"15","level":"2","type":"category","parent_id":"1"}, 
{"id":"6","name":"item 2","root":"1","lft":"16","rgt":"19","level":"2","type":"category","parent_id":"1"}, 
{"id":"10","name":"item 3","root":"1","lft":"20","rgt":"21","level":"2","type":"item","parent_id":"1"}]}'); 
+0

Solo un errore, stavo sperimentando e ho dimenticato di cambiarlo prima di postare. Risolto il problema qui, il problema è sempre lo stesso. – JPR

+1

Puoi creare fiddle per questo con alcuni dati fittizi? –

+0

Certo, potrebbero essere necessari alcuni minuti per riunirlo. Grazie. – JPR

risposta

1

Il problema è nel vostro utilizzo del _.without method. Gli elementi da escludere vengono passati come un numero variabile di argomenti, non come una matrice.

utilizzo sbagliato:

_.without(['a','b'],['a']) 

risultati in ['a', 'b'] (non quello che volete)

considerando quanto segue:

_.without(['a','b'],'a') 

produce il risultato atteso: ['b']

Ecco un updated fiddle con la correzione.

Nota: per evitare il riferimento ciclico, stampo genitore.id anziché parent nell'output "Risultato".

1

Si fa il lavoro per me. Semplifico leggermente il codice e ho aggiunto l'elemento nipotino. Date un'occhiata: http://jsfiddle.net/7QYQL/1/

var grandchild = {}; 
grandchild.name = 'grandchild'; 
var child = {}; 
child.name = 'child'; 
child.children = []; 
child.children[0] = grandchild; 
var root = {}; 
root.name = 'root'; 
root.children = []; 
root.children[0] = child; 

Il problema è stato _.without(), che accetta un elenco piuttosto che un array come secondo parametro.

_.without(fields, 'parent','children') 

Questo funziona: http://jsfiddle.net/eRbhm/13/

+0

Grazie e grandi complimenti per quello. Ho provato la tua prima risposta e ha funzionato, ma il mio codice non funzionava ancora e non riuscivo a capire come il tuo fosse fondamentalmente diverso da quello che stavo facendo. Fixing _. Senza aggiustarlo all'istante, l'avevo completamente ignorato. – JPR

Problemi correlati