Как сделать интерактивную строку в rich: datatable?
У меня есть страница JSF с rich:dataTable
, где в каждой строке я помещаю h:commandLink
, чтобы привести страницы с деталями выбранной строки.
Я хотел сделать целую строку кликабельной, вызвав метод действия, когда пользователь нажимает в любом месте строки.
Возможно ли это без JavaScript?
И если JavaScript - единственный выход, каким будет лучший способ? Найдите командуLink и "click" it?
Спасибо заранее!
Ответы
Ответ 1
Я получил целые строки, которые можно было бы щелкнуть с помощью немного стилизации. Я сделал ссылки внутри ячеек, занимая всю ячейку с display: block;
для ссылок и padding:0
для ячейки.
Итак, вот что вам нужно сделать. На странице JSF настройте rowClasses
и ссылки в каждой ячейке:
<rich:dataTable value="#{myMB.listaElems}" var="elem" rowClasses="clickable">
<rich:column>
<h:commandLink action="#{myMB.preUpdate(elem)}" value="#{elem.item1}" />
</rich:column>
<rich:column>
<h:commandLink action="#{myMB.preUpdate(elem)}" value="#{elem.item2}" />
</rich:column>
</rich:datatable>
И в листе CSS:
tr.clickable td {
padding: 0;
}
tr.clickable td a {
display: block;
padding: 4px;
}
И что это!
Единственным недостатком является то, что вам нужно повторить ссылку в каждой ячейке, но поток HTTP остается простым, вам не нужно менять какой-либо компонент, и он будет работать для h:link
или старого старого <a>
html ссылки - довольно приемлемый компромисс, я бы сказал.:)
Ответ 2
Основная проблема заключается в том, что JSF (core) привязан к элементу HTML table
для рендеринга результата запроса через компонент dataTable
. Поскольку JSF dataTable
отображается как HTML table
, результат ограничивается тем, что можно управлять в столбцах (без контроля строки, который я видел). Способ HTML/CSS для этого довольно изящный, но для этого в JSF я считаю, что рендеринг UIComponent
для dataTable
должен быть переопределен для вывода этого:
<div class="table">
<a href="#" class="row">
<span class="cell">Column-1-Value</span>
<span class="cell">Column-2-Value</span>
</a>
...
</div>
С стилями CSS table
row
и cell
, представляющими display:table
, display:table-row
и display:table-cell
; соответственно. Это делает строку полностью кликабельной, но она ведет себя как правильная таблица. Я не приступил к повторной записи JSF-рендеринга и решению JSF commandLink
и других проблем с компонентами для выполнения рендеринга, как указано выше, но это, вероятно, окончательный ответ. Я не являюсь поклонником JSF после борьбы с ним по нескольким проектам сейчас (по сравнению с более легкими комбинациями веса концепций из базового HTML/CSS, разбрызгиванием JavaScript, чистой Java/Servlets и т.д.).
Ответ 3
в вашем используемом datatable используйте это:
<a4j:jsFunction name="selectRow" action="#{userBean.myListener" ...>
<a4j:param name="currentRow" assignTo="#{userBean.selectedRowId}"/>
</a4j:jsFunction>
его вызывается при выборе строки, и вы можете делать все, что хотите, и передавать выбранную строку с помощью <a4j:param
... в качестве опции вы также можете вызвать yourLink.click()
или что-то подобное, но это не проблема, чтобы узнать...
ссылка: Форум Richfaces
Ответ 4
Вы можете попробовать rich:scrollableDataTable
. он имеет атрибут onRowClick
, который вы можете указать как атрибут event
в a4j:support / a4j:ajax
, вложенный внутри вашей таблицы. Это сделает вашу строку доступной.
-cheers:)
Ответ 5
Для нового RichFaces 4.x вместо этого вы можете использовать a4j:commandLink
и сделать полную строку, выбираемую в CSS. Обратите внимание, что 'rowClasses="clickable"
' относится к классу CSS для выбора всей строки:
<rich:column id="fileName" sortable="false" width="618px">
<a4j:commandLink action="#{controller.setSelectedFile(file)}"
oncomplete="window.open('#{menuBar.PrintPage}?outputType=pdf', '_blank');"
rendered="#{not controller.getButtonDisabled(file)}"
execute="@this" limitRender="true">
<h:outputText value="${file}"
style="text-align:left;width:100%;min-width:400px;"
title="${file.name} is viewable.">
<f:converter converterId="MVC.View.Converter_FilePath" />
</h:outputText>
</a4j:commandLink>
</rich:column>
Используйте этот класс CSS для выбора всей строки:
tr.clickable td {
padding: 0;
}
tr.clickable td a {
display: block;
padding: 4px;
}