2017-01-17 1 views
2

Ich versuche, Staffel-Shape-Objekt als Parameter zu den MooTools new Class object übergeben und dann bekomme ich die Maximum call stack size exceeded Fehler.MooTools Klasse setOptions: Maximale Call-Stack-Größe exeeced

Dies funktioniert gut in meiner Klasse Code:

initialize: function(options){ 
    this.options = options; 
} 

Aber dies führt zu einem Fehler:

initialize: function(options){ 
    this.setOptions(options); 
} 

Was mit diesem falsch? setOptions funktioniert normalerweise gut, aber in diesem Fall nicht. Gibt es etwas falsch, wie MooTools class->setOptions Eingabeparameter behandelt?

In meinem Beispiel:

options = {"target": {easelShapeobject}} 
+0

gesehen werden Beachten Sie, dass 'options = {" Ziel ": {Staffeleiobjekt}} ist ungültig sintax. Es sollte 'Optionen = {" Ziel ": Staffeleiobjekt}' sein. Wenn der Fehler ein Tippfehler in der Frage ist, können Sie den echten Code zeigen, den Sie verwenden? – Sergio

+0

Mein Fehler. Es war schlecht präsentiert und meine Syntax war buchstäblich falsch. Ich meinte, dass {elaselShapeobject} eigentlich ein Objekt {} ist und der Typ dieses Objekts ist elaselShapeObject. – XorGate

+0

Ich habe das irgendwie gelöst, aber ich bin nicht zufrieden damit. Ich habe eine Zeile "container.addChild (elem)" an das Ende meiner Funktion verschoben und es hat gut funktioniert. Ich glaube, dass dies eine Ad-hoc-Lösung ist und das Hauptproblem dahinter steckt. Ich glaube, dass die MooTools setOptions-Funktion diesen Fehler verursacht. Es kann nicht mit komplexen Objekten umgehen. – XorGate

Antwort

0

bedenken Sie, dass setOptions auf Object.merge setzt Requisiten zu kopieren - aber wenn der Wert ein anderes Objekt ist, wird es rekursiv.

https://github.com/mootools/mootools-core/blob/master/Source/Core/Core.js#L385-L407

, wenn Sie eine easeljs Instanz (nicht sicher auf der API) übergeben, wird ein Objekt sein, und es kann versuchen, dass durch zu folgen und/Klon fusionieren, bis es etc beendet - es ist nicht ein gutes Muster zu verwenden, da Sie mit neuen Objekten enden würden, die nicht über die richtigen Konstruktoren verfügen.

Übergeben Sie die Staffelei als ein Argument außerhalb der Optionen.

new Class({ 
    implement: [Options], 
    initialize: function(options, target){ 
    this.setOptions(options); 
    this.target = target || new createjs.Shape({..some default options}); 
    } 
}) 

Sie behalten die Referenz, brechen aber nicht die Proto-Kette. Wenn das Ziel nicht definiert ist, können Sie einen Standardpfad angeben.

Im Rahmen das kann vielleicht Element eine easeljs.Stage() oder eine ID eines Canvas-Objekt verwenden usw.

tl; dr setOptions sollte mit nicht-primitiven Werten nicht beschäftigen. das gleiche Problem würde über native Object.assign oder _.merge/_.clone etc.

+0

Ja, genau das habe ich schließlich getan. Ich habe das Ziel von den Optionen getrennt und übergebe es als weiteren Parameter. – XorGate