【问题标题】:PrimeFaces inputText enable/disablePrimeFaces inputText 启用/禁用
【发布时间】:2013-10-22 01:16:40
【问题描述】:

我在 JSF2/PrimeFaces 页面上有两个单选按钮,我需要根据选择启用/禁用 inputText 字段。

<h:form prependId="false">
    <p:panelGrid id="notif">
        <p:row id="notif1">
            <p:column>
                <h:outputText value="label" />
            </p:column>
            <p:column>
                <p:selectOneRadio id="radiobuttons" value="#{state.radioStatus}" layout="pageDirection">
                    <f:selectItem itemLabel="enable" itemValue="enable" />
                    <f:selectItem itemLabel="disable" itemValue="disable" />
                    <p:ajax update="date" />
                </p:selectOneRadio>
            </p:column>
            <p:column>
                <p:inputText id="date" value="#{state.infoDate}" disabled="#{!state.checkStatus}" >
                </p:inputText>
                <p:inputText id="test" value="#{state.infoDateTest}">
                </p:inputText>
            </p:column>
        </p:row>
    </p:panelGrid>
</h:form>

这一切都在一个选项卡内,但是在检查生成的 html 时没有嵌套表单。这些字段似乎获得了选项卡的 id,但它们似乎是正确的(尝试对 ajax 使用 id notation 'tabView:date' 时不起作用。)

问题是进入页面时,“实际”文本字段默认是禁用的,当单选按钮设置为启用时应该启用它。当单选按钮状态更新时,我可以看到该事件已在服务器端注册,并且 inputText 字段“可视”启用(默认情况下它被禁用)。但是该字段在启用后无法“聚焦”,因此无法写入。

当我添加 'test' inputText 字段时,它变得更奇怪了,它不会自动启用/禁用单选按钮。在新页面加载时,您可以对其进行写入,但在更改单选按钮状态后,它不再可写(在 ajax 调用之前输入的文本将保留,但不可编辑)。

但是单选按钮继续工作,并将在服务器端触发事件。

谁能指出我可能做错了什么,或者这可能是 PrimeFaces 的一个错误?

// 更新 就像说的那样,托管 bean 按预期工作,所以我看不出有任何问题,但这里是代码(为了便于阅读,已简化并重命名,因为相关部分取自更大的上下文)。

@ManagedBean(name = "state")
@SessionScoped
public class ExampleBean implements Serializable {

    private static final String disable = "disable";
    private static final String enable = "enable";
    private String text;
    private List<TestRow> rows = null;
    private TestRow row = null;
    private String radioStatus = "enable";
    private String infoDate = "";
    private String infoDateTest = "";

    @PostConstruct
    public void initEmpty() {
    }

    public String getRadioStatus() {

        return this.radioStatus;
    }

    public void setRadioStatus(String radioStatus) {

        this.radioStatus = radioStatus;
    }

    public String getInfoDate() {

        return infoDate;
    }

    public void setInfoDate(String infoDate) {

        this.infoDate = infoDate;
    }

    public String getInfoDateTest() {

        return infoDateTest;
    }

    public void setInfoDateTest(String infoDateTest) {

        this.infoDateTest = infoDateTest;
    }

    public boolean isCheckStatus() {

        return this.radioStatus.equalsIgnoreCase(enable) ? true : false;
    }
}

【问题讨论】:

  • 您处理的是哪个 PF 版本?您还可以发布您的托管 bean 代码吗?
  • 抱歉,忘记了该信息。 PrimeFaces 3.5(扩展 0.6.3)。
  • 应该猜到了。我在我的一个测试项目上尝试了上面的代码,而“实际”页面上没有额外的东西,现在我可以正常工作了。下一步似乎是将其添加到选项卡中并解决实际页面上的其他组件/功能。
  • 大多数时候最好的解决方案是在一个测试项目中尝试像你一样的东西。很高兴看到它起作用了 ;-)
  • 你是对的。建立一个干净的测试项目只需要一些额外的工作。当原始页面正常工作时,第一个假设是它可能是框架内的错误。如果我遇到这样的事情,我必须保留这个测试项目以供将来测试。

标签: jsf-2 primefaces


【解决方案1】:

不幸的是,我无法弄清楚导致实际问题的原因。基本的事情似乎是继承的javascript(primefaces)在这个页面上不能正常工作(可能是因为继承了一些其他的js)。最后我把它做成了一个自定义的启用/禁用 js 函数:

js.toggleDisableStatus = function(elementId) {

// Can't use jQuery $("#xx:yy"), the syntax is not accepted by jquery but
// used by JSF/PrimeFaces
var element = document.getElementById(elementId);
var attrValue = element.getAttribute('disabled');
if (attrValue === undefined || attrValue == null) {
    element.disabled = true;
    element.style.background = "#dddddd";
} else {
    element.removeAttribute('disabled');
    element.style.background = "";
}
};

这可能有缺陷,但目前有效。单选按钮由持久状态(加载状态)选择,并且输入字段的启用/禁用状态也在初始加载页面时设置。一般来说,我认为这应该适用于这种特殊情况。

【讨论】:

  • 我基于这个问题做了一些其他的研究:我有来自两个单独的 SessionScope 实现的 bean,这导致在重新加载页面时再次初始化 SessionScoped bean。在这里找到了解释:stackoverflow.com/questions/11887940/…
  • 在将 SessionScopes 的导入全部修复为“import javax.faces.bean.SessionScoped”后,我摆脱了 bean 的无效构造,但不幸的是,原来的问题仍然存在(ed)。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多