次のような属性のEL式を記述する必要があります。
#{cc.attrs.appreciatedByCurrentUser ? (cc.attrs.count +'<br/>'+ (cc.attrs.count-1)) : ((cc.attrs.count+1) +'<br/>'+ cc.attrs.count)}
問題は、文字列を連結できないためにエラーが発生することです。これは私が行っている方法です。では、どうすればこれを修正できますか?
faceletでJSF 2.0を使用しています
次のインラインjavascriptを使用して問題を解決しています
<script type="text/javascript">
var count=#{cc.attrs.count};
document.write(#{cc.attrs.appreciatedByCurrentUser} ? (count-1) +'<br/>'+count : count+'<br/>'+ (count+1));
</script>
これについて何か問題がありますか?
ELでの文字列の連結は、式のインライン化によってのみ可能です。 +
演算子は、ELでは合計演算子のみです。さらに、<
および>
はXML属性では無効な文字であるため、それらをエスケープする必要があります(<h:outputText>
に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}" />
または、<c:set>
を使用して式のエイリアスを作成することもできます。
<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" />
Java.lang.String.concat(String)
メソッドを使用して、ELで文字列を連結することができます。したがって、コードは次のようになります。
<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" />
ただし、この特定のケースでは、上記のコードは非常にエレガントに見えないため、BalusC氏が提案したオプションの1つを使用します。ただし、この手法を知っていると便利な場合もあります。
ここで回避策としてJavaScriptを使用することはほとんどお勧めしません。
これは私が思いつくことができる唯一のものです。
<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>
<br>
をvalue属性に設定すると、JSFで常にエラーがスローされるため、display:block
を使用する必要があります。