Нужна помощь с циклом в JS - PullRequest
1 голос
/ 22 марта 2010

У меня есть такая функция, которая добавляет сетку капель:

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
                            }
                          }
                        );
                      }
                });
            }
        }
     }
}

Проблема в том, что параметры Ajax.Request (неделя, день, время) всегда равны неделям + 1, разам + 1, дням + 1. Но они должны варьироваться в зависимости от цикла. О, да - Droppables из фреймворка script.aculo.us.

Ответы [ 2 ]

1 голос
/ 22 марта 2010

Проблема в вашем понимании замыканий.Значение недели, дня и т. Д., Которые являются локальными переменными в функции включения, будет последним значением в момент завершения выполнения 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 голосов
/ 22 марта 2010

Это работает после шаманских танцев:

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);
            }
        }
    }
}
...