2010-03-21 35 views
1

我有這樣的功能,即增加了droppables網格:需要與週期有助於JS

function AddClassroomDrops(grid, weeks, days, times) { 
    for(week = 1; week <= weeks; week++) { 
     for (day = 1; day <= days; day++) { 
      for (time = 1; time <= times; time++) { 
       Droppables.add('container_grid'+ grid + '_week' + week + '_day' + day + '_time' + time, { 
        accept: 'pair', 
        hoverclass : 'hovered_receiver', 
        onDrop: function(pair, receiver) { 
         new Ajax.Request(
          '/pairs/'+pair.id+'/update_on_drop', { 
          method : 'put', 
          parameters : { 
           classroom : grid, 
           week : week, 
           day : day, 
           time : time, 
           container : receiver.id 
          } 
          } 
         ); 
         } 
       }); 
      } 
     } 
    } 
} 

的問題是,PARAMS的Ajax.Request的(周,日,時)總是等於周+ 1,次數+1,天數+1。但是它們必須根據週期而變化。哦,是的 - Droppables來自script.aculo.us框架。

回答

1

問題在於你對閉包的理解。封閉函數中作爲局部變量的星期,星期等的值將是AddClassroomDrops執行完成時的最後一個值。避免這種情況的典型方法是返回一個函數並將局部變量傳遞給另一個函數。例如:

function enclosing() 
{ 
    for(var i = 0; i < 10; i++) 
    { 
     var f = function(j) { return function closureFunc() { // use j here }; }(i); 
     // here you can do Droppables.add(f); 
    } 
} 
0

這工作薩滿舞后:

function AddClassroomDrops(grid, weeks, days, times) { 
    for(week = 1; week <= weeks; week++) { 
     for (day = 1; day <= days; day++) { 
      for (time = 1; time <= times; time++) { 
       var drop = function(week, day, time) { 
        Droppables.add('container_grid'+ grid + '_week' + week + '_day' + day + '_time' + time, { 
         accept: 'pair', 
         hoverclass : 'hovered_receiver', 
         onDrop: function(pair, receiver) { 
          new Ajax.Request(
           '/pairs/'+pair.id+'/update_on_drop', { 
           method : 'put', 
           parameters : { 
            classroom : grid, 
            week : week, 
            day : day, 
            time : time, 
            container : receiver.id 
           } 
           } 
          ); 
          } 
        }); 
       } 
       drop(week, day, time); 
      } 
     } 
    } 
}