我有一个具有String属性的对象,该属性可能有四个可能的值,对于每个值,我想将不同的css类放入单元格。我想知道是否有办法在这里写复合条件:
<ui:repeat value="#{row.info}" var="wui" >
<td class="#{wui.status eq 'In execution'? 'inexec' : '' }">
<!--<td id="wuitd" onLoad="classfunction()" >-->
<h:outputText value="#{wui.status}" />
<h:outputText value="#{wui.remainingEffort} effort units" />
</td>
</ui:repeat>
我尝试编写一个javascript函数,但我不确定它是否正确,我认为函数调用是错误的:
<td id="wuitd" onLoad="classfunction()" >
<h:outputText value="#{wui.status}" />
</td>
<script>
function classfunction(){
char status = document.getElementById("wuistatus").value;
switch(status) {
case 'In execution':
document.getElementById("wuitd").style.parentRule('inexec');
break;
case 'Ready for execution':
document.getElementById("wuitd").style.parentRule('ready');
break;
case 'Finished':
document.getElementById("wuitd").style.parentRule('finished');
break;
case 'Not ready':
document.getElementById("wuitd").style.parentRule('notExec');
break;
default:
code block
}
}
</script>
你可以找到你需要了解的关于问题的JS部分的大部分或全部内容here ...我不知道“wui”部分是关于什么的。
进一步参考(您可以更好地使用Google并添加一些额外的关键字来匹配您的环境):
我在这种情况下的第一个想法几乎是使用“嘿,我知道,我可以使用jQuery!” ......我知道,“现在我有两个问题”,但确实有效:o)
无论如何,我假设你在这里加载了某种JS框架。如果是这样,并且它不是jQuery,请找出它的“页面加载”机制是什么。除非您完全确定将在您的应用程序中使用哪些浏览器,否则您不希望“手动”了解如何执行此操作。
看起来您正在使用JSP / JSF(或至少使用EL表达式的东西)。在将来的问题中,最好准确指定您正在使用的内容(通常通过标签)。根据EL的文档,您可以使用哈希查找。因此,如果您可以在某个地方定义以下内容,则可以在模板中访问:
statusToClass = {
"In execution": "inexec",
... // define your other value -> class translations
}
你应该能够:
<td class="#{statusToClass[wui.status]}">
<h:outputText value="#{wui.status}" />
</td>
我承认我不知道EL,所以在哪里或如何定义statusToClass
尚不清楚。但是,此方法可以很好地避免支持对象/哈希的其他语言的多个条件。只要你可以依靠wui.status
总是具有可预测的价值。这是因为您在查找时没有编程控制,也没有机会回退到默认值。在JavaScript中,您可以轻松添加回退,但不能确定EL会支持这种回退。
statusToClass[wui.status]||'default'
看起来你可以定义可以被EL3访问的方法(作为Bean的一部分) - https://docs.oracle.com/javaee/7/tutorial/jsf-el003.htm - 所以这可能是你可以研究的另一条路径(而不是JavaScript方法,看起来它可能容易出现几个问题,即onLoad
和.value
- 除非您正在使用的Java上下文通过扩展支持这些)。通过它的声音,你越多地融入EL期望的工作方式,就越容易 - 特别是当使用像ui:repeat
这样的其他惯例时。