Насколько я понимаю, с тегом a4j: jsFunction:
<a4j:jsFunction name="okClicked" actionListener="#{ts.rem}" />
, помещенным в столбец таблицы данных, JavaScript-функция с именем okClicked
будет добавлена на страницу HTML в столбцедля каждого ряда таблицы.Имея одно и то же имя, каждая функция JavaScript перезаписывает определение предыдущего, поэтому при вызове okClicked()
фактически выполняется только последняя определенная функция.Именно поэтому вызывается actionListener
, который вызывает «действие против последнего элемента».
Обходным путем будет включение индекса строки как части имени функции JavaScript, создаваемойтег a4j: jsFunction:
<h:dataTable value="#{ts.list}" var="el" binding="#{ts.bind}" rowIndexVar="index">
<h:column>
<a href="#" onclick="okClicked#{index}();">delete by okClicked</a>
<a4j:jsFunction name="okClicked#{index}" actionListener="#{ts.rem}"/>
</h:column>
</h:datatable>
Я не проверял вышеупомянутое решение (и я не знаю, будет ли проблема связывать #{ts.rem}
с функцией JS actionListener
, а не связыватьэто commandLink
actionListener
), но если значение onClick
okClicked#{index}();
не работает напрямую, вместо этого вызовите функцию javaScript, которая создает имя функции из строки, построенной из значения индекса:
function onClicked(row) {
functionStr = "okClicked" + row;
window[functionStr]();
}
Мне пришлось использовать что-то подобное, требуя сетку 'jsFunction's внутри таблицы данных, где у меня было несколько столбцов, а также несколько строк.
Надеюсь, это полезно для других вбудущее.