【问题标题】:show hide inputTextarea on click of a commandLink in jsf在jsf中单击commandLink时显示隐藏inputTextarea
【发布时间】:2013-07-23 13:15:16
【问题描述】:

点击commandLink,inputTextArea 应该出现/渲染。 这是我正在尝试的代码 -

<h:form id="MyForm">
<p:commandLink id="OnUseLink" style="text-align: right; vertical-align: bottom;">
 <p:ajax event="click" render=":MyForm:OnUse" ></p:ajax>
 <h:graphicImage styleClass="rollover imgAligntop" style="border:none;" name="plus.gif" library ="images"/>
</p:commandLink>

<p:inputTextarea id="OnUse" size="15"></p:inputTextarea>
</h:form>

请有人帮忙。

【问题讨论】:

  • 我真的不明白你想要什么?默认情况下,文本区域应隐藏并在单击按钮后出现。这是你想要的吗??
  • @Kishor P - 是的,你没看错。

标签: jquery jsf jsf-2 xhtml


【解决方案1】:

客户端解决方案

要显示/隐藏元素,请在客户端代码中使用纯 JavaScript/jQuery(示例)/其他 JS 库:

<p:commandLink value="Toggle" onclick="$('#MyForm\\:OnUse').toggle('slow'); return false;" />

服务器端解决方案

要启用/禁用,或渲染/不渲染,请在服务器代码中添加适当的标记条件:

<p:commandLink value="Toggle" action="#{bean.action}" update="placeholder" />
<h:panelGroup id="placeholder" layout="block">
    <p:inputTextarea id="OnUse" size="15" rendered="#{bean.rendered}" disabled="#{bean.disabled}" />
</h:panelGroup>

用豆子:

@ManagedBean
@ViewScoped
public class Bean implements Serializable {
    private boolean rendered = true;//getter
    private boolean disabled = false;//getter
    public String action {
        //use some model condition to derive new rendered property value
        rendered = !rendered;//or disabled = !disabled;
        return null;
    }
}

请务必了解客户端/服务器代码的区别。另请注意,JSF 组件的属性设置只能在服务器上完成,否则,如果您决定通过 JavaScript 更改它们,则更改将不起作用。

【讨论】:

  • 我想做你在第二个选项中建议的事情。但我不明白'neam'指的是什么。我想“bean.disabled” bean 是托管 bean。
  • 它也应该是bean。您需要提供一个操作方法,该方法将根据某些模型条件将呈现的属性设置为 true 或 false。
  • 我尝试了您的两个选项,但都不起作用。我正在使用 jsf2.0。没有模型条件。我只需要点击commandlink,就会出现inputTextarea。
  • 对于客户端解决方案,问题出在“符号:当然它必须是 ' 而不是(请参阅答案更新)。对于服务器端解决方案,模型条件是一个 bean 属性的星座,应该指示应该渲染或禁用有问题的组件。这些条件可能会在表单提交后发生变化,但组件的这些属性最终应该取决于 bean 属性(例如,如果用户没有除非填写了某些表单输入等,否则必须禁用特定角色或组件。
【解决方案2】:

您不需要 p:ajax 来更新组件。
命令按钮本身有一个 update 属性。
完成此场景的常用方法是将 TextArea 放在 PanelGroup 中。
更新 Panel 组并将 rendered 应用于组件。

并且您不需要其在相同的表单中时引用其id附加到表单ID [formID:componentId]的组件>。

试试这个:

ToggleBean.java

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@ViewScoped
public class ToggleBean implements Serializable {

    private boolean renderer=false;

    public boolean isRenderer() {
        return renderer;
    }

    public void setRenderer(boolean renderer) {
        this.renderer = renderer;
    }

    public void buttonAction(){
        renderer = !(renderer);
    }

}

XHTML 页面:

<h:form id="MyForm">
            <p:commandLink id="OnUseLink" style="text-align: right; vertical-align: bottom;" action="#{toggleBean.buttonAction}" value="click" update="usePanelGroup">
                <h:graphicImage styleClass="rollover imgAligntop" style="border:none;" name="plus.gif" library ="images"/>
             </p:commandLink>

            <h:panelGroup id="usePanelGroup">
                <p:inputTextarea id="OnUse" size="15" rendered="#{toggleBean.renderer}" ></p:inputTextarea>
            </h:panelGroup>

        </h:form>

祝你好运。

【讨论】:

  • 您的 bean 在错误的范围内。如果最终用户在同一会话中的多个浏览器窗口/选项卡中打开了相同的视图,则它们都受到单个属性的影响! stackoverflow.com/questions/7031885/…
  • @BalusC :我认为它现在已修复。并感谢其他建议以及否决票,我的任何帖子都不会再发生这种情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 2016-05-21
相关资源
最近更新 更多