2

是一次禁用或启用一组组件的任何方式。例如:我想禁用整个表单,它又具有几个 InputTexts,Dropdowns,......我希望能够一次禁用或启用所有它们。

怎么做?而不是使用布尔变量并将 disable="#{boolean variable} 添加到所有组件。有没有其他方法可以将它们全部放在一个组件中并使其启用或禁用?

4

4 回答 4

2

正如@Kukeltje 在类似的问题中告诉我的那样:“对于每个 jsf 的较新版本,请检查massAttribute(来自omnifaces)”。

在我意识到我使用自己的代码一次禁用一组组件之前。这是我的代码,但我建议使用前面所说的“massAttribute”:

public class UtilsPrimefaces { 

/**
 * Disable all the children components
 * @param uiComponentName
 */
public static void disableUIComponent(String uiComponentName) {  
    UIComponent component = FacesContext.getCurrentInstance()  
            .getViewRoot().findComponent(uiComponentName);
    if(component!=null) {
        disableAll(component.getChildren());
    } 
}  

/**
 * Recursive method to disable the list
 * @param components Widget PD list
 */
private static void disableAll(List<UIComponent> components) {  

    for (UIComponent component : components) {  
        logger.info(component.getClass().getTypeName());            

        if (component instanceof InputText) {  
            ((InputText) component).setDisabled(true);

        } else if (component instanceof InputNumber) {  
            ((InputNumber) component).setDisabled(true);

        } else if (component instanceof InputTextarea) {  
            ((InputTextarea) component).setDisabled(true);

        }  else if (component instanceof HtmlInputText) {  
            ((HtmlInputText) component).setDisabled(true);

        }  else if(component instanceof SelectOneMenu) {  
            ((SelectOneMenu) component).setDisabled(true);

        } else if(component instanceof SelectBooleanCheckbox) {  
            ((SelectBooleanCheckbox) component).setDisabled(true);

        } else if(component instanceof CommandButton) {  
            ((CommandButton) component).setDisabled(true);              
        }
        disableAll(component.getChildren());  
    }  
} 

然后你可以在你的豆子中使用它。这是一个具有 3 个滚动面板并且只想禁用面板 1 和面板 3 的页面的示例:

@PostConstruct
public void init() {        
    super.init();        
    Utils.disableUIComponent(":form:panel1");
    Utils.disableUIComponent(":form:panel3");
}

这是相关问题的链接

于 2017-09-14T10:12:37.353 回答
1

有很多方法可以做到这一点。如果您使用的是 primefaces,则可以使用<p:blockUI />组件。您可以自定义“禁用区域”的 css 样式。

查看官方演示:https ://www.primefaces.org/showcase/ui/misc/blockUI.xhtml

于 2017-09-14T14:56:41.557 回答
0

我见过几种不同的方法:

抛出 SystemEvent 时添加禁用属性: https ://stackoverflow.com/a/15031242/1981358

创建一个自定义组件来环绕您的表单字段: https ://stackoverflow.com/a/11453029/1981358 https://stackoverflow.com/a/9543826/1981358

正如 rags 所提到的,可以使用 PF blockUI,特别是如果您需要在客户端事件处理期间限制访问。

同样,您可以使用 jQuery 在页面上插入您自己的自定义“玻璃”,这将阻止任何点击(并且真的会惹恼您的用户)。

于 2013-09-09T22:16:56.930 回答
0

如果您只需要使它们不可点击,也许 javascript/jquery 就足够了吗?查看此答案以使用 jquery 禁用它们。

于 2013-04-15T11:26:26.667 回答