2015-06-30 2 views
1

Я новичок в handsontable библиотеке javascript и, следовательно, извиняюсь, если вопрос кажется слишком простым.Handsontable: setDataAtCell на триггере события

Что я пытаюсь сделать, так это то, что если кто-то пишет/изменяет данные, записанные в первой строке таблицы, значение в ячейке в столбце 5 и строке 5 должно быть установлено на «изменено». Я знаю, что для установки значения мне нужно будет использовать hot.setDataAtCell (5,5, «changed»). Я не знаю, как вызвать эту команду. I.e Мне нужно найти способ определить, когда была изменена любая ячейка в первой строке столбца. Я попробовал переопределить обратный вызов afterChange, но код продолжает висит.

заранее спасибо

+0

http://jsfiddle.net/8hv4z/18 /, что-то похожее на это? –

+0

Привет. Просто попробовал код. По-видимому, этот код работает нормально, но если я добавлю команду hot.setDataAtCell (5, 5, «33»); внутри функции afterChange она перестает работать. «горячий» - это имя моей руки. Вы хоть понимаете, почему это происходит? Эта же команда работает нормально, если я добавлю ее за пределы всего –

ответ

0

Это должно решить вашу проблему,

Пример:

var cellChanges = []; 

$(document).ready(function() { 
    var myData = [{ 
     0: 'aaaaaaaaaaaaa', 
     1: 'bbbbbbbbb', 
     2: 'ccccccc' 
    }, { 
     0: 'aaaa', 
     1: 'b', 
     2: 'bbbb' 
    }, { 
     0: 'aaaa', 
     1: 'x', 
     2: 'bbbb' 
    }, { 
     0: 'aaaa', 
     1: 'w', 
     2: 'bbbb' 
    }, ]; 

    $("#editOrders").handsontable({ 
     data: myData, 

     autoWrapRow: true, 
     minSpareRows: true, 
     columnSorting: true, 
     fillHandle: false, 
     currentRowClassName: 'currentRow', 
     colHeaders: ["demo", "demo", "demo"], 
     afterChange: function (changes, source) { 
      if (!changes) { 
       return; 
      } 
      $.each(changes, function (index, element) { 
       var change = element; 
       var rowIndex = change[0]; 
       var columnIndex = change[1]; 

       var oldValue = change[2]; 
       var newValue = change[3]; 

       var cellChange = { 
        'rowIndex': rowIndex, 
        'columnIndex': columnIndex 
       }; 

       if(oldValue != newValue){ 
        cellChanges.push(cellChange); 
       } 
      }); 
     }, 
     afterRender: function() { 
      var instance = $('#editOrders').handsontable('getInstance'); 
      $.each(cellChanges, function (index, element) { 
       var cellChange = element; 
       var rowIndex = cellChange['rowIndex']; 
       var columnIndex = cellChange['columnIndex']; 
       var cell = instance.getCell(rowIndex, columnIndex); 
       var foreColor = '#000'; 
       var backgroundColor = '#ff00dd'; 
       cell.style.color = foreColor; 
       cell.style.background = backgroundColor; 
      }); 
     }, 
     columns: [{ 
      //LINE 
      data: 0 
     }, { 
      //LINE 
      data: 1 
     }, { 
      //LINE 
      data: 2 
     }, 

     ] 
    }); 

}); 

и вот ссылка на jsfiddle;
http://jsfiddle.net/8hv4z/18/

1

setDataAtCell() не похоже на работу внутри функции обратного вызова afterChange.

Способ сделать это состоит в использовании инициализирована переменная для данных при инициализации handsontable как данные: MyData, а затем функция afterChange должна выглядеть следующим образом:

afterChange: function (changes, source) { 
    mydata[5][5]="changed"; 

    this.render(); 
} 
+1

, причина в том, что setDataAtCell запускает событие afterChange. он бросил бы его в бесконечный цикл :), поэтому я предполагаю, что handson достаточно умен, чтобы поймать, что – ZekeDroid

+0

да, это было единственной причиной того, что код не работает. :-) –

+0

yup, надо быть осторожным с событиями в руках, они очень мощные. что-то, что нужно запомнить, - это то, что большинство методов handson запускают событие afterChange. Чтобы обойти это, вы должны сделать то, что вы сделали здесь, и вручную изменить свой источник данных, без каких-либо методов handson – ZekeDroid

Смежные вопросы