2012-08-03 46 views
0

如果required=true的字段未填充值,禁用commandButton的最佳方法是什么?根据当前表单的必填字段禁用/启用commandButton?

该按钮应该在第一次加载页面时被禁用,并且只有在所有必填字段都是带有值的字段的情况下才能启用该按钮。

通过最好的办法我意味着没有javascript和最小码:-)

此外,当所有validators评估为真commandButton时,才会启用这将是极好的。

使用PF 3.2

编辑

  • 通过最好的方法,我也意味着,只应在客户端评估
+1

客户端没有JavaScript? – Ravi 2012-08-03 16:42:35

+0

使用javascript,这将易于维护和轻松为您的客户端(iexplore,firefox,chrome等Internet浏览器)和服务器(Web应用程序服务器)。每个输入组件上的每个“onchange”都会有很多的ajax调用,它会变得非常沉重。如果你不想使用JavaScript,因为你不知道,学习一些,如果你不想要一个非功能性的需求限制,向负责人解释为什么ajax实现将是一个非常糟糕的方法,JavaScript会成为你的朋友。 – 2012-08-03 21:11:03

回答

2

这有两个原因是不可能的。

  1. 对于客户端验证,您绝对需要javascript。
  2. 组件的required属性仅存储在服务器端,客户端不知道默认情况下需要哪些字段。

如果不使用required,您可以在客户端实现此功能,如下所示。 validateContent应该包含禁用commandButton的逻辑。

<h:inputText value="#{bean.text}" > 
    <pe:javascript event="keyup" execute="validateContent();"/> 
</h:inputText> 

如果将服务器是好的,那么你可以这样做:

<h:inputText id="test1" value="#{bean.text}" required="true" immediate="true"> 
    <f:ajax listener="#{bean.makeDisable()}" render="test2" /> 
</h:inputText> 
</h:commandButton id="test2" value="commandButton1" disabled="#{bean.disable}" /> 

而且在豆:

private String text; 
    private boolean disable; 

    // setter & getter of text 

    public boolean isDisable() 
    { 
    return disable; 
    } 

    public void makeDisable(AjaxBehaviorEvent event) 
    { 
    if(text == null || text.equals("")) 
     this.disable=true; 
    else 
     this.disable=false; 
    } 

这基本上将加载commandButton禁用初始加载和它只会在输入文本字段中的任何值时启用。

+0

由于表单上还有其他必填字段,因此您的ajax功能实际上不会调用其服务器端事件,因为验证将失败。 – 2012-08-03 17:49:56

+1

哦,是的,这些字段也需要“立即”。 – Arjun 2012-08-03 17:55:57

1

这是可能的,但我很难说它是“最好的方式”。

您需要为每个字段上的更改事件提供ajax标签。每个字段必须是immediate才能跳过初始验证,并且需要将process设置为@this

在事件监听器中,您可以检查每个必填字段是否存在值,如果是,则设置一个布尔值字段来确定commandButton是否被禁用。

这些ajax标签将需要render@this以及commandButton

但即使如此,还是有很多的Javascript实际上正在进行,只是没有,你将不得不直接写。