2016-07-25 38 views
0

Ich möchte eine Sammlung von Objekten erstellen, die wie ein Array funktioniert. Vor einiger Zeit habe ich this question und ich kam mit der folgenden Lösung mit Hilfe der Personen, die mir geholfen:Javascript - Sammlung von Objekten mit übergeordneten Eigenschaften gemeinsam

Newobj.Collection = function(){ 
    Array.apply(this); 

    for(var i = 0; i < arguments.length; i++){ 
     for(var j = 0; j < arguments[i].length; j++){ 
      this.push(arguments[i][j]); 
     } 
    } 

    return this 
} 

Newobj.Collection.prototype = Object.create(Array.prototype); 
Newobj.Collection.prototype.push = function(o){ 
    Array.prototype.push.call(this, new Newobj.Element(o)); 
} 

Dies ist jedoch die Kinder, die Blätter von der Mutter nicht angeschlossen. Stellen Sie sich zum Beispiel vor, dass diese Sammlung eine render()-Funktion hat, die ihre Kinder dazu bringt, etwas HTML auf die Seite zu drucken. Nun, ich möchte in der Lage sein, etwas zu sagen wie:

Newobj.Collection.html_container = '#cont'; 

Newobj.Collection.render = function(){ 
    $.each(this, function(i, el){ 
     el.render() 
    }) 
} 

Newobj.Element.render = function(){ 
    $(parent.html_container).html('.......') 
} 

Es sollte verschiedene Kollektionen auf einer Seite festlegen können, so stellen eine globale container für die ganze Newobj.Collection s ist keine Lösung. Dies ist ein Beispiel, und ich brauche dies für komplexere Prozesse als nur eine render() Funktion.

Jeder hat eine Idee, wie kann ich ein Array machen, um auf eine Elternklasse zugreifen zu können, zu der es gehört?

Wenn die Lösung könnte JSON.stringify ed und als ein Array auf der Serverseite gesehen werden, wäre es auch toll, obwohl es nicht das Hauptproblem für diese Frage ist. Jetzt, wenn ich eine Eigenschaft auf das Array festlegen, wird es als ein Objekt mit size > 0 auf der Serverseite gesehen.

Vielen Dank!

Antwort

1

erstellen Bezug auf Sammlung im Element:

Newobj.Collection.prototype.push = function(o){ 
    Array.prototype.push.call(this, new Newobj.Element(o,this)); 
} 

//element constructor gets as second paramater instance of collection 
Newobj.Element=function(o,collection){ 

    //this.parent in every element is collection reference 
    this.parent=collection; 
} 


Newobj.Element.prototype.render = function(){ 
    $(this.parent.html_container).html('.......') 
} 

oder kein Hinweis in Element Option:

Newobj.Collection.render = function(){ 

    var parent=this; 

    $.each(this, function(i, el){ 
    el.render(parent.html_container) 
    }) 
} 

Newobj.Element.render = function(html_container){ 
    $(html_container).html('.......') 
} 

Aber diese Version müssen Methoden Parameter haben.

+0

Hätte nicht gedacht. Ich werde es testen und wenn ich sehe, ob es funktioniert (das sollte es, wie ich es gelesen habe), markiere ich deine Antwort als die richtige! Danke für Ihre Hilfe! – Unapedra

+0

Ich habe ein * mögliches * mögliches Problem gefunden. Wenn ich die * Sammlung * als Parameter verwende, was passiert dann mit der Elementnummer 100, wenn ich dort bin? Wird es eine Eigenschaft namens * parent * haben, in der es bereits 99 andere Elemente gibt? und der 99., wird eine * Eltern * -Eigenschaft mit einem Array mit 98 Elementen haben, und so weiter? – Unapedra

+0

Dieser Parameter ist eine Objektreferenz, so dass es keine 100 Objekte, sondern ein Objekt und 100 Referenzen gibt, so dass es keine Leistungsprobleme geben wird. –