5

Ho una fabbrica angolare il cui compito è salvare oggetti speciali e recuperarli in seguito.
(utilizzato per salvare il flusso di lavoro degli utenti quando cambia visualizzazione).Come inserire oggetti nell'array all'interno di un prototipo JavaScript?

Fondamentalmente ho bisogno di salvare oggetti con un nome, così come una serie di tag. Il mio problema è con il salvataggio dei tag nella parte dell'array.

Il prototipo costruttore:

// define the TagsObject constructor function 
var TagsObject = function(name, tag) { 
    this.name = name; 
    this.tags = [].push(tag); 
    return this; 
}; 

codice di fabbrica completa:

.factory('TagFactory', [function() { 

    // Init TagFactory: 
    var tagContainers = []; 

    // define the TagsObject constructor function 
    var TagsObject = function(name, tag) { 
     this.name = name; 
     this.tags = [].push(tag); 
     return this; 
    }; 

    console.log('tagFactory'); 
    console.log(TagsObject); 

    var saveTags = function(name, tag) { 

     tagContainers.push(new TagsObject(name, tag)); 

     console.log('saveTags:'); 
     console.log(tagContainers); 
    }; 

    var getTags = function(name) { 
     console.log(name); 
     return this; 
    }; 

    return { 
     saveTags : saveTags, 
     getTags : getTags 
    }; 
}]); 

In un controller diverso ora salvare alcuni dati in un new Prototype all'interno della TagFactory:

TagFactory.saveTags('TEST', tagObj); 

Ora torna nella mia fabbrica, dove vedi lo console.log(nameTagContainers); il seguente è il registro:

[TagsObject] 
    0: TagsObject 
    tags: 1 
    name: "TEST" 
    __proto__: TagsObject 
    length: 1 
    __proto__: Array[0] 

^tag è una matrice, ma sta mostrando 1, al posto dei dettagli dell'oggetto ... ti vedi dove ho sbagliato?



UPDATE: Questa domanda è stato risposto di seguito dal Kauê Gimenes, però sto condividendo il codice aggiuntivo ho aggiunto per risolvere il mio altro problema.

Che era ogni volta un nuovo tag è stato selezionato per un nome attualmente selezionato, ha generato un nuovo prototipo, invece di salvare il tag in un prototipo esistente:

var saveTags = function(name, tag) { 

    console.log(tagContainers.length); 

    if (tagContainers.length != 0) { 
     for(var i = 0; i < tagContainers.length; i++) { 
      if (tagContainers[i].name == name) { 
       console.log('Found existing name! Add tag to existing obj'); 
       tagContainers[i].tags.push(tag); 
       break; 
      } else { 
       console.log('New name, create new obj'); 
       tagContainers.push(new TagsObject(name, tag)); 
      } 
     } 
    } 
    else { 
     console.log('New name, init: create the first obj'); 
     tagContainers.push(new TagsObject(name, tag)); 
    } 

    console.log(' '); 
    console.log('tagContainers:'); 
    console.log(tagContainers); 
}; 

risposta

2

Prova questo approccio:

// define the TagsObject constructor function 
var TagsObject = function(name, tag) { 
    this.name = name; 
    this.tags = [tag]; 
    return this; 
}; 

Il modo migliore per inizializzare un array è di includere gli elementi all'interno delle staffe

[ 1 , 2 , 3 ] 

Tuttavia, se si desidera inizializzare con gli elementi n, è possibile utilizzare la funzione concat.

[ 1 ].concat([ 2 , 3 , 4 ]) 

Il risultato sarebbe:

[ 1 , 2 , 3 , 4 ] 
+0

Ah sì che funziona, e fa rispondere a questa domanda ... però ho capito ho scritto questo codice errato. Ci sono diversi tag che l'utente può selezionare per 1 nome. In questo momento il mio codice crea un nuovo prototipo ogni volta che l'utente fa clic su un nuovo tag per un solo nome. Grazie! Devo aggiornare il mio codice ed eventualmente postare una nuova domanda. –

+1

Includo alcune informazioni aggiuntive per rendere la risposta più chiara, se avete ancora domande su questo sentitevi liberi di chiedere! –

+0

ah ok così l'array * n * elements potrebbe risolvere il mio nuovo problema qui –