[英]Handsontable - I found a bug when copying/pasting a german numeric value
我想在我的下一個項目中使用Javascript網格框架Handsontable,但我發現了一個小bug,這是使用這個lib的阻塞點。 :-(
我必須顯示一張德國價格表,例如“ 18,50€”。 德語以小數點(,)表示。 默認情況下,handsontable僅對嵌入式“ numeral.js”幫助程序庫使用語言“ en”。 因此,為numeric.js添加了德語(de)語言定義。 單元格格式定義為“0.00 $”,它將在網格中正確顯示為“18,50€”。
但是當我選擇一個例如“1,50€”的單元格(單擊單元格)時,按“Ctrl + C”並再次使用Ctrl + V將其粘貼到另一個單元格中。 新單元格的值為“15,00€”,因為剪貼板中復制的值為“1.5”,然后將其粘貼為“15”。
HTML:
<div id="exampleGrid"></div>
使用Javascript:
(function () {
var language = {
delimiters: {
thousands: '.',
decimal: ','
},
abbreviations: {
thousand: 'k',
million: 'm',
billion: 'b',
trillion: 't'
},
ordinal: function (number) {
return '.';
},
currency: {
symbol: '€'
}
};
if (typeof window !== 'undefined' && this.numeral && this.numeral.language) {
this.numeral.language('de', language);
}
}());
$("#exampleGrid").handsontable({
data: [ [1.5], [] ],
rowHeaders: true,
colHeaders: true,
columns: [
{ type: 'numeric', format: '0.00 $', language: 'de'}
]
});
我創建了一個用於演示問題的jsfiddle: http : //jsfiddle.net/hU6Kz/4873/
我使用版本0.23.0。 我嘗試了很多來解決這個bug(鈎子,自定義驗證器......),但沒有任何幫助,因為我沒有在事件回調中得到原始值“1.5”。 我只得到錯誤的值“15”。 當在handsontable構造函數中使用“ beforeChange”鈎子作為附加選項時,您可以看到以下內容:
beforeChange: function (changes, source) {
for (var i = changes.length - 1; i >= 0; i--) {
console.log('Changes: source:' + source + ' row:' + changes[i][0] + ' col:' + changes[i][1] + ' old:' + changes[i][2] + ' new:' + changes[i][3]);
}
}
當我復制並粘貼“ 1,50€”時,控制台將顯示:
Changes: source:paste row:1 col:0 old:null new:15
我的想法是識別1.50並在handontable更新單元格之前將其更改為1,50,但新值已經是“15”,因此沒有機會看到原始復制的值。 :-(
也許你們中的某個人有一個想法。
提前致謝。
在源代碼中,我找到了執行以下操作的函數“ validateChanges”:
if (numeral.validate(changes[i][3])) {
changes[i][3] = numeral().unformat(changes[i][3]);
}
當當前數字語言為'de'並將其命名為“ 15”時。 所以這是問題,但如何解決呢?
numeral().unformat('1.5 €')
現在我明白了,為什么在調用鈎子“ beforeChange”時沒有得到原始的復制值。 因為此“ validateChanges”是在掛鈎被觸發之前調用的。
現在?
在第24646行替換:
if (languages[currentLanguage].delimiters.decimal !== '.') {
string = string.replace(/\./g, '').replace(languages[currentLanguage].delimiters.decimal, '.');
}
有了這個:
if (languages[currentLanguage].delimiters.decimal !== '.') {
string = string.replace(languages[currentLanguage].delimiters.decimal, '.');
}
第一個字符串替換從原始數據中刪除小數點。
注意:我不太熟悉這個js庫,這可能會導致意想不到的后果。 在他們的github頁面上與項目維護者討論問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.