Очистите ввод перед изменением - PullRequest
0 голосов
/ 03 июля 2018

Я использую handsontable 0.35.1 с плавающей колонкой. Цель состоит в том, чтобы позволить пользователям копировать вставки из электронных таблиц (и csvs, открытых в Excel). Проблема состоит в том, что это идет с некоторым мусором, от которого я должен избавиться. Некоторые примеры входных данных, которые не были правильно проверены:

1,000.00
USD 100.00
'10000.00  '  //note there are trailing spaces

Я бы хотел найти способ манипулировать вводом непосредственно перед его записью. Единственный способ, который я нашел до сих пор, это с beforeChange, но проблема в проверке. Система изменяет ввод, но, кажется, уже проверила. Если я размываю и снова размываю, это работает.

Вот скрипка . Шаги для воспроизведения: введите число a123, которое должно быть исправлено на 123 и подтверждено как правильное число.

Я пытался использовать вместо него beforeValidation, но он не работает так, как я собираюсь.

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Вы можете использовать beforePaste обратный вызов для очистки вашего ввода

  options = {
    columns: [
      { type: 'date' },
      { type: 'numeric', numericFormat: {pattern: '0,0.00'} }
  ],
  colHeaders: ["Date", "Float"],
  beforePaste: (data, coords) => {
    data.forEach((col, colIndex) => {
        col.forEach((row, rowIndex) => {
        let value = row.trim().replace(/[^0-9\.\-\+]/g, '')
        data[colIndex][rowIndex] = value
      })
    })
    return true
  },
}
$('#hot-sheet').handsontable(options)

вот скрипка https://jsfiddle.net/xpvt214o/348195/

Примечание: вы не можете создать новый массив данных, вы должны обновить массив данных вместо создания нового.

0 голосов
/ 03 июля 2018

Я обновил пример https://jsfiddle.net/fma4uge8/29/, все работает в одной функции.

function trimFloat(value) {
    return value.trim().replace(/[^0-9\.\-\+]/g, '');
}

options = {
  columns: [
    { type: 'date' },
    { type: 'numeric', numericFormat: {pattern: '0,0.00'}, trimWhitespace: true }
  ],
  colHeaders: ["Date", "Float"],
  beforeChange: function(changes, source){
    let that = this;
    _.each(changes, function(change){
      if (_.isString(change[3])) {
            let value = trimFloat(change[3]);
          //prevent endless loop
          if (value !== change[3]) {
            change[3] = trimFloat(change[3]);
                        that.setDataAtCell(change[0], change[1], change[3]);       
          }
      }
    })
  }
}
$('#hot-sheet').handsontable(options)
...