2013-10-14 41 views
3

我在JSF2/PrimeFaces页面上有两个单选按钮,我需要根据选择启用/禁用inputText字段。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,但它们似乎是这样正确的(当尝试使用ID标记'tabView:date'作为ajax时没有工作。)

问题是,当进入页面中,“实际”文本字段默认处于禁用状态,应在单选按钮设置为启用时启用。当单选按钮状态更新时,我可以看到事件已在服务器端注册,并且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; 
    } 
} 
+1

你正在处理哪个PF版本?你也可以发布你的托管bean代码吗? –

+0

对不起,忘记了信息。 PrimeFaces 3.5(扩展0.6.3)。 –

+0

应该猜到了。我在我的一个测试项目上尝试了上面的代码,没有在“实际”页面上添加额外的东西,现在我已经有了这个工作。下一步似乎将其添加到选项卡中,并解析实际页面上的其他组件/功能。 –

回答

0

不幸的是我无法弄清楚是什么导致了实际问题。基本的东西似乎是继承的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 = ""; 
} 
}; 

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

+0

我根据这个问题做了一些其他的研究: 我从两个单独的SessionScope实现中获得了Bean,这导致在页面重新加载时再次初始化SessionScoped bean。对此的解释发现在这里: \t http://stackoverflow.com/questions/11887940/jsf-2-session-bean-created-for-every-request –

+0

将所有的SessionScopes导入修复为'import javax。 faces.bean.SessionScoped'我摆脱了bean的无效构造,但不幸的是原始问题仍然存在(编辑)。 –

相关问题