是一次禁用或启用一组组件的任何方式。例如:我想禁用整个表单,它又具有几个 InputTexts,Dropdowns,......我希望能够一次禁用或启用所有它们。
怎么做?而不是使用布尔变量并将 disable="#{boolean variable} 添加到所有组件。有没有其他方法可以将它们全部放在一个组件中并使其启用或禁用?
是一次禁用或启用一组组件的任何方式。例如:我想禁用整个表单,它又具有几个 InputTexts,Dropdowns,......我希望能够一次禁用或启用所有它们。
怎么做?而不是使用布尔变量并将 disable="#{boolean variable} 添加到所有组件。有没有其他方法可以将它们全部放在一个组件中并使其启用或禁用?
正如@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");
}
这是相关问题的链接
有很多方法可以做到这一点。如果您使用的是 primefaces,则可以使用<p:blockUI />
组件。您可以自定义“禁用区域”的 css 样式。
查看官方演示:https ://www.primefaces.org/showcase/ui/misc/blockUI.xhtml
我见过几种不同的方法:
抛出 SystemEvent 时添加禁用属性: https ://stackoverflow.com/a/15031242/1981358
创建一个自定义组件来环绕您的表单字段: https ://stackoverflow.com/a/11453029/1981358 https://stackoverflow.com/a/9543826/1981358
正如 rags 所提到的,可以使用 PF blockUI,特别是如果您需要在客户端事件处理期间限制访问。
同样,您可以使用 jQuery 在页面上插入您自己的自定义“玻璃”,这将阻止任何点击(并且真的会惹恼您的用户)。
如果您只需要使它们不可点击,也许 javascript/jquery 就足够了吗?查看此答案以使用 jquery 禁用它们。