5

Ich habe eine Angular Factory, deren Aufgabe es ist, spezielle Objekte zu speichern und später wiederzufinden.
(Wird verwendet, um den Workflow des Benutzers zu speichern, wenn er die Ansichten wechselt).Wie schiebt man Objekte innerhalb eines JavaScript-Prototyps in ein Array?

Grundsätzlich muss ich Objekte mit einem Namen, sowie ein Array von Tags speichern. Mein Problem ist mit dem Speichern der Tags in den Array-Teil.

Der Prototyp Konstruktor:

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

Vollwerkscode:

.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 einem anderen Controller ich nun einige Daten in eine new Prototype innerhalb des TagFactory sparen:

TagFactory.saveTags('TEST', tagObj); 

Jetzt zurück in meiner Fabrik, wo Sie diesehen 10 das folgende ist das Protokoll:

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

^Tags ist ein Array, aber es 1 zeigt, anstelle der Objektbeschreibung ... siehst du, wo ich schief gelaufen?



UPDATE: Diese Frage unten beantwortet wurde von Kauê Gimenes, aber ich teilen ich den zusätzlichen Code Ich habe mein anderes Problem zu beheben.

, die jedes Mal, wenn ein neuer Tag war für einen aktuell ausgewählten Namen ausgewählt wurde, erzeugte er einen neuen Prototyp, anstatt den Tag in eine bestehenden Prototype Sparend:

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); 
}; 

Antwort

2

versuchen, diesen Ansatz:

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

Der beste Weg initialisieren ein Array ist, die Elemente in den Klammern enthalten

[ 1 , 2 , 3 ] 

Aber wenn Sie mit n Elemente initialisieren möchten, können Sie die concat Funktion verwenden.

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

Das Ergebnis wäre:

[ 1 , 2 , 3 , 4 ] 
+0

Ah ja, das funktioniert, und tut diese Frage beantworten ... aber ich, dass ich diesen Code falsch nur realisiert schrieb. Es gibt mehrere Tags, die der Benutzer für einen Namen auswählen kann. Im Moment erstellt mein Code jedes Mal einen neuen Prototyp, wenn der Benutzer auf ein neues Tag für nur einen Namen klickt. Vielen Dank! Ich muss meinen Code aktualisieren und möglicherweise eine neue Frage stellen. –

+1

Ich füge einige zusätzliche Informationen hinzu, um die Antwort klarer zu machen, wenn Sie noch Fragen dazu haben, zögern Sie nicht zu fragen! –

+0

ah ok so das * n * Elemente Array konnte mein neues Problem hier beheben –

Verwandte Themen