Wie durch Gegenstände von Wert aus einem Array auf eine Variable in Javascript passieren

StackOverflow https://stackoverflow.com/questions/1810563

  •  05-07-2019
  •  | 
  •  

Frage

ich versuche durch ein Array „fSel.sI“, eine Schleife und auf der Basis der Daten innerhalb, geben sie als Werte (nicht Referenz) auf einer Reihe von Funktionsdeklarationen. Im Augenblick ist das Problem ist, dass mydrag eine Referenz enthält, und als ziehbar wird aufgerufen, verwendet es die letzte Array Positionsdaten. Wenn also Start: Ziehen: Stopp: genannt wird, die Werte sind nicht eindeutig. Hilfe?

makeDraggable : function() {
        // create new draggable
        for (var i = 0; i < fSel.sI.length; i++) {
            mydrag = fSel.sI[i];
            $("#" + mydrag).draggable({
                cancel: [''],
                distance: 5,
                containment: "#fWorkspace",
                handle: mydrag,
                start: function() { dragRegister(mydrag)},
                drag: function() { dragItems(mydrag)},
                stop: function() { dragStop(mydrag)}
            });
        }
    },
War es hilfreich?

Lösung

Sie sollten Blick in Schließungen .

Versuchen Sie, den folgenden Code:

makeDraggable : function() {
        // create new draggable
        for (var i = 0, l = fSel.sI.length, sI = fSel.sI; i < l; i++) {
                var mydrag = sI[i];
                (function(mydrag) {
                            $("#" + mydrag).draggable({
                                    cancel: [''],
                                    distance: 5,
                                    containment: "#fWorkspace",
                                    handle: mydrag,
                                    start: function() { dragRegister(mydrag); },
                                    drag: function() { dragItems(mydrag); },
                                    stop: function() { dragStop(mydrag); }
                            });
                })(mydrag);
         }
},

Ihr Problem ist mit den start, drag und stop Funktionen. Sie führen nicht sofort; durch die Zeit, die sie tun, mydrag wurde auf einen anderen Wert eingestellt. Durch Wickeln eines selbstausführende Funktion um den Codeblock diese Funktionen enthält, erstellen wir einen Verschluss, wo mydrag ändert sich nicht.

Hinweis: Aus Gründen der Performance, wenn Eigenschaften eines Objekts mehr als einmal zugreifen, ist es am besten, eine Variable zu erstellen, dass Verweise (oder hält) die Eigenschaft. In Ihrer for Schleife habe ich zwei Variablen l und sI erstellt, die fSel.sI.length und fSel.sI speichern (jeweils), so dass JavaScript nicht jedes Mal um die Schleife der sI und length Eigenschaften nachschlagen muß.

Andere Tipps

Dies ist, weil Ihr einen Verschluss zu schaffen. Versuchen Sie stattdessen

makeDraggable : function() {
        // create new draggable
        for (var i = 0; i < fSel.sI.length; i++) {
                mydrag = fSel.sI[i];
                $("#" + mydrag).draggable({
                        cancel: [''],
                        distance: 5,
                        containment: "#fWorkspace",
                        handle: (function(mydrag){return mydrag;}(mydrag)),
                        start: (function(mydrag){return function() { dragRegister(mydrag)};}(mydrag)),
                        drag: (function(mydrag){return function() { dragItems(mydrag)};}(mydrag)),
                        stop: (function(mydrag){return function() { dragStop(mydrag)};}(mydrag))
                });
        }
    },

Werfen Sie einen Blick auf dieses Video die leistungsstarke und Nützlichkeit von Javascript Schließungen zu verstehen: http://vimeo.com/1967261

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top