jsf - numeros - Concatenación de cadenas dentro de la expresión EL definida en un atributo de una etiqueta de facelets
etiquetas jsf (3)
Es posible concatenar cadenas en EL usando el método java.lang.String.concat(String)
. Por lo tanto, su código podría verse así:
<h:outputText value="#{cc.attrs.appreciatedByCurrentUser ? (''''.concat(cc.attrs.count).concat(''<br/>'').concat(cc.attrs.count-1)) : (''''.concat((cc.attrs.count+1)).concat(''<br/>'').concat(cc.attrs.count))}" escape="false" />
Sin embargo, en este caso particular iría con una de las opciones que el Sr. BalusC sugirió porque el código anterior no se ve muy elegante. Sin embargo, en algunos casos, conocer esta técnica podría ser útil.
No recomendaría usar javascript como solución alternativa aquí.
Necesito escribir una expresión EL para un atributo que dice algo como esto:
#{cc.attrs.appreciatedByCurrentUser ? (cc.attrs.count +''<br/>''+ (cc.attrs.count-1)) : ((cc.attrs.count+1) +''<br/>''+ cc.attrs.count)}
Ahora el problema es que esto da un error ya que las cadenas no se pueden concatenar, como lo estoy haciendo. Entonces, ¿cómo puedo rectificar esto?
Estoy usando JSF 2.0 con facelets.
EDITAR:
Estoy resolviendo el problema usando el siguiente JavaScript en línea
<script type="text/javascript">
var count=#{cc.attrs.count};
document.write(#{cc.attrs.appreciatedByCurrentUser} ? (count-1) +''<br/>''+count : count+''<br/>''+ (count+1));
</script>
¿Puedes pensar en algún problema con esto?
Esto es lo único que se me ocurre.
<h:panelGroup rendered="#{cc.attrs.appreciatedByCurrentUser}">
<h:outputText value="#{(cc.attrs.count)}" style="display:block;" />
<h:outputText value="#{(cc.attrs.count-1)}" />
</h:panelGroup>
<h:panelGroup rendered="#{not cc.attrs.appreciatedByCurrentUser}">
<h:outputText value="#{(cc.attrs.count+1)}" style="display:block;" />
<h:outputText value="#{(cc.attrs.count)}" />
</h:panelGroup>
Al poner <br>
en un atributo de valor siempre arrojará errores en JSF, por lo que tendrá que usar display:block
.
La concatenación de cadenas en EL solo es posible simplemente al subrayar en la expresión. El operador +
está en EL exclusivamente como operador de suma. Además, <
y >
son caracteres no válidos en los atributos XML, por lo que debe escapar de ellos (e instruir a <h:outputText>
para que no los escape una vez más por escape="false"
):
<h:outputText value="#{cc.attrs.count}<br/>#{cc.attrs.count-1}" escape="false" rendered="#{cc.attrs.appreciatedByCurrentUser}" />
<h:outputText value="#{cc.attrs.count+1}<br/>#{cc.attrs.count}" escape="false" rendered="#{!cc.attrs.appreciatedByCurrentUser}" />
Alternativamente, también puede usar <c:set>
para alias de la expresión:
<c:set var="appreciated" value="#{cc.attrs.count}<br/>#{cc.attrs.count-1}" />
<c:set var="notAppreciated" value="#{cc.attrs.count+1}<br/>#{cc.attrs.count}" />
<h:outputText value="#{cc.attrs.appreciatedByCurrentUser ? appreciated : notAppreciated}" escape="false" />