2017-01-12 4 views
1

Ich wollte einige jQuery Animatios dynamisch festlegen.Pass dynamische Parameter zu Callback-Funktion in einer Schleife

Der Code:

function anim(data) { 
    for (index in data) { 
     (function(){ 
      var props = {}; 
      props[data[index].property] = data[index].value; 
      data[index].elem.animate(
       props, 
       500, 
       function() { 
        data[index].callback(); 
       } 
      ); 
     })(); 
    } 
} 

var data =[ 
    { 
     elem: elem1, 
     property: 'prop1', 
     value: 'val1', 
     callback: function() { 
      console.log('callback1'); 
     } 
    }, 
    { 
     elem: elem2, 
     property: 'prop2', 
     value: 'val2', 
     callback: function() { 
      console.log('callback2'); 
     } 
    }, 
]; 
anim(data); 

Das Problem ist bindend Rückrufe. Wenn der Rückruf ausgelöst wird, ist data[index] im aktuellen Bereich nicht verfügbar. Kann mir jemand sagen, wie ich diese Rückruf-Funktion einstellen soll?

+0

wie Sie Index in Daten? – rahulsm

+0

Warum brauchen Sie eine Schließung der IIFE? Sie können es entfernen, um zu überprüfen oder den Index dort gerade zu führen, wie in der Antwort unten vorgeschlagen. – Jai

Antwort

4

Hier haben Sie eine closure von Immediately-invoked function expression verwendet. Sie müssen als Parameter übergeben.

(function(dindex){ 
     var props = {}; 
     props[dindex.property] = dindex.value; 
     dindex.elem.animate(
      props, 
      500, 
      function() { 
       dindex.callback(); 
      } 
     ); 
})(data[index]); 
2

Sie mögen dies als Alternative können versuchen,

function anim(data) { 
    $.each(data, function(x,y){ 
     var props = {}; 
     props[y.property] =y.value; 
     y.elem.animate(
      props, 
      500, 
      function() { 
        y.callback(); 
      } 
     ); 
    }); 


} 
+0

Einfach Methode. +1. –

+0

Danke! @ Alexandru-IonutMihai – rahulsm