我的JSF2(带Facelets)应用程序需要在ReadOnly / Editable模式下打开许多页面。以下是所需的确切行为:
如果我在页面上有TextArea,在ReadOnly模式下我不想让它被禁用/ readOnly,我想要一个outputText。在可编辑模式下,它应该表现为TextArea。
考虑到我需要在应用程序中的多个页面上执行此行为,这将是一种合适的方法。
我应该编写两个组件(textArea和outputText)并操纵它们的渲染属性来显示一个。
是否有可能以某种方式控制JSF上元素的行为并渲染文本而不是组件本身(可能通过编写自定义渲染器)?
非常感谢您的投入。
答案 0 :(得分:1)
感谢大家的投入...... :-) 嗨找到了一种让它以不同方式工作的方法。我必须写下以下内容:
这是我的XHTML
<rw:readWrite readOnlyOn="#{!rwBean.editMode}">
<h:panelGrid columns="2">
<h:outputLabel value="Booking Center P" />
<h:selectOneMenu id="bookingCentre" value="#{rwBean.bookingCenter}">
<f:selectItems value="#{rwBean.bookingCenterList}" />
</h:selectOneMenu>
<h:outputLabel value="Account Number 1" />
<h:inputText id="accountNumber1" value="987654" maxlength="7" />
</h:panelGrid>
</rw:readWrite>
根据属性“readOnlyOn”的值,我的自定义标记会在其每个子组件中设置一个属性。 我的自定义渲染器会检查标记上此属性的值,并有条件地呈现标记本身或其“值”属性。
我已经为所有JSF和PrimeFaces标签实现了这个,它似乎对我有用。
答案 1 :(得分:0)
您可以创建复合组件或标记文件,以便最终得到这样的结果:
<my:inputTextArea editable="#{bean.editable}" />
基本上包含复合组件的
<h:inputTextArea rendered="#{cc.attrs.editable}" />
<h:outputText rendered="#{!cc.attrs.editable}" />
或标签文件
<c:choose>
<c:when test="#{editable}"><h:inputTextArea /></c:when>
<c:otherwise><h:outputText /></c:otherwise>
</c:choose>