У меня есть p:dataTable, который имеет несколько столбцов для значений месяца, например:
<p:column width = "80" headerText = "Januar">
<p:inputNumber value = "#{mto.month01}" symbol = "€" symbolPosition = "s" decimalPlaces = "0"
disabled = "#{((mto.year eq indexController.currentYear) and (indexController.currentMonth gt 1)) or (mto.year lt indexController.currentYear) or (indexController.isComponentDisabled('fieldPMForecastOutflow', 'PM'))}">
<p:ajax process = "@this" partialSubmit = "true"
update = ":contentform:dt-PMDetail contentform:blockButtonDeletePMYear"
listener = "#{indexController.updateWorkingCopyProjectManagementFinancesDTO}" />
</p:inputNumber>
</p:column>
Мои пользователи хотят иметь возможность вставлять ячейки Excel в эту таблицу данных.
Я пробовал разные фрагменты javascript, например. г. это и адаптировал вот так:
$('input').bind('paste', function (e) {
var $start = $(this);
var source
//check for access to clipboard from window or event
if (window.clipboardData !== undefined) {
source = window.clipboardData
} else {
source = e.originalEvent.clipboardData;
}
var data = source.getData("Text");
if (data.length > 0) {
if (data.indexOf("\t") > -1) {
var columns = data.split("\n");
$.each(columns, function () {
var values = this.split("\t");
$.each(values, function () {
$start.val(this);
if ($start.next('input')) {
$start = $start.next('input');
$start.val(this);
}
if ($start.closest('td').next('td').find('input')) {
$start = $start.closest('td').next('td').find('input');
}
else
{
return false;
}
});
$start = $start.closest('td').parent().next('tr').children('td:first').find('input');
});
e.preventDefault();
}
}
});
Когда я вставляю данные, символ валюты теряется, проверка не происходит (я могу вставлять буквы), и как только я навожу указатель мыши на поле, значение сбрасывается до исходного значения.
То, что я ищу, - это решение, которое «переходит» к следующему полю и вводит значение, как если бы я использовал клавиатуру (например, только числа). Если вставлено слишком много столбцов, их можно опустить. Новая строка в данных Excel должна привести к новой строке в DataTable (если я вставлю таблицу 3x3 в столбец 4 строки 1, столбцы с 4 по 6 в строках с 1 по 3 должны быть заполнены).



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вместо того, чтобы напрямую записывать значение в поле ввода компонента, используйте API виджета и используйте его функцию setValue для установки значения.
Из документации:
Устанавливает значение этого виджета ввода числа в заданное значение. Проверяет правильность формата номера.
Я согласен, что виджет setValue() для InputNumber — это именно то, что вам нужно. Просто нужно выяснить, как получить виджет для ячейки, которую вы редактируете. Хотя это должно быть возможно.
В консоли браузера функция setValue отлично работает для данного widgetVar. Я попытался добавить следующие теги к моему <p:inputNumber>: id = "dtMTO#{mto.year}01" widgetVar = "dtMTO#{mto.year}01" чтобы иметь возможность использовать element.id в качестве моего widgetVar в функции PF(), но я предполагаю, что мой rowKey недоступен при создании идентификатора (id - mto01, widgetVar mto202301 для первой строки). Любая помощь приветствуется, чтобы получить мой виджет PF из заданного элемента js?
Это другая проблема. Пожалуйста, посмотрите, сможете ли вы найти ответ на этот вопрос на SO. Если вы не можете, задайте новый вопрос и отметьте его PrimeFaces. См. например stackoverflow.com/questions/15660969/…
Я построил widgetVar на основе столбца и rowIndexVar. Затем я могу перебрать свой ввод, прочитать идентификатор столбца и сгенерированный номер строки, который эквивалентен индексу для использования PrimeFace setValue(). Что еще не работает: я частично обрабатываю эти значения в событии ajax и показываю сумму. Есть ли способ вызвать событие ajax при setValue() или обработать всю таблицу из моего javascript?
Нашел: я использовал <p:remoteCommand>, который обновляет и обрабатывает все необходимое и вызывается в конце моего javascript.
Спасибо за Ваш ответ. У меня была идея пойти по этому пути, но я не нашел пути. Насколько мне известно, мне нужно использовать widgetVar в функции
PF(...)? До сих пор я перемещался между элементами, используя путь html, и не нашел способа, как решить эту проблему с помощью PF?