我有一个<p:dataTable>
,最后一列有一个复选框。我想根据复选框的状态为表格的行着色。
<p:dataTable var="acs" value="#{myBean.listaRevogaveis}"
emptyMessage="#{rotulo.mensagemSemDados}" paginator="true"
rows="10" id="tableacs"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink}">
<p:column headerText="Nome" sortBy="#{acs.nome}"
filterBy="#{acs.nome}">
<h:outputText value="#{acs.nome}" />
</p:column>
<p:column headerText="Address" sortBy="#{acs.address}" filterMatchMode="contains"
filterBy="#{acs.address}" filterMaxLength="8">
<h:outputText value="#{acs.address}" />
</p:column>
<p:column headerText="Perfil" sortBy="#{acs.cdPerfil}"
filterBy="#{acs.cdPerfil}" filterMaxLength="2">
<h:outputText value="#{acs.cdPerfil}" />
</p:column>
<p:column headerText="Cadastramento">
<h:outputText value="#{acs.tsSolicitacao}">
<f:convertDateTime pattern="dd/MM/yyyy" />
</h:outputText>
</p:column>
<p:column headerText="Concedido">
<h:outputText value="#{acs.concedidoPor}" />
</p:column>
<p:column headerText="Revogar">
<p:selectBooleanCheckbox value="#{acs.ativo}" >
<p:ajax event="valueChange" oncomplete="toggleColor(this, #{acs.ativo}" listener="#{myBean.checkBox}" update="@form"/>
</p:selectBooleanCheckbox>
</p:column>
</p:dataTable>
所以在#{acs.ativo}
切换时,我希望该行能够获得不同的背景颜色。
根据this question的回答,我尝试将其添加到我的xhtml:
<style type="text/css">
.linhaDestacada { background-color: red !important;}
</style>
<script type="text/javascript">
function toggleColor(col, status) {
var linha = jQuery(col).parent();
if(status) {
linha.removeClass('linhaDestacada');
} else {
linha.addClass('linhaDestacada');
}
}
</script>
但这没用。我发出一些警告,看看是否正在调用该函数,它是。但是,尝试查看tagName或linha
变量的任何属性都会返回null。
还有一个有趣的观点,即使用复选框的前一个值调用回调。选中此框后,j toggleColor()
在status
上收到错误,当其未选中时收到true。
如何使用复选框切换使行背景切换?
答案 0 :(得分:0)
好的,那个中有一些错误和问题。
<强>首先强>
primefaces将行的背景设置为空白图像(取决于皮肤)。您必须覆盖背景的url()
,因此CSS应如下所示:
.linhaDestacada {background:url('')red!important;}
第二名:
从ajax标签调用javascript导致jQuery找到空值(不知道为什么)。使用其onchange
属性将回调移至复选框标记。
最终的javascript片段是:
<script type="text/javascript">
function toggleColor(col, status) {
var linha = jQuery(col).parent().parent().parent().parent().parent();
if(status) {
linha.removeClass('linhaDestacada');
//alert("remove " + linha.html());
} else {
linha.addClass('linhaDestacada');
//alert("add " + linha.html());
}
}
</script>
<强>第三强>
更新WHOLE表单是一个禁忌(你用javascript添加的css类正在被删除)...你应该只更新真正重要的东西(在这种情况下,复选框和命令按钮。
<p:selectBooleanCheckbox value="#{acs.ativo}" onchange="toggleColor(this, #{acs.ativo})">
<p:ajax event="valueChange" listener="#{myBean.checkBox}" update="@this :formAcesso:btnRevogaNuke" />
</p:selectBooleanCheckbox>
<强>第四:强>
commandButton没有渲染。它会在ajax响应上更新,但浏览器没有显示它。找到this answer,并在封装元素上移动了标识btnRevogaNuke
:
<h:panelGroup id="btnRevogaNuke" layout="block">
<p:commandButton icon="ui-icon-alert" value="Confirmar rendered="#{myBean.confirmar()}" style="margin-left:600px;" action="#{acessoBean.revogaTodos()}" process="@this @form" update="@form" />
</h:panelGroup>