3

我实现了一个简单的方法,它迭代 JSF 组件树并将组件设置为禁用。(因此用户无法更改这些值)。但此方法不适用于复合组件。我怎样才能至少检测到复合组件?然后我可以尝试将特殊属性设置为禁用。

4

1 回答 1

4

该类UIComponent有一个isCompositeComponent()用于此目的的辅助方法。

所以,这应该只是这样做:

for (UIComponent child : component.getChildren()) {
    if (UIComponent.isCompositeComponent(child)) {
        // It's a composite child!
    }
}

对于对“幕后”工作感兴趣的人,这里是 Mojarra 2.1.25 的实现源代码:

public static boolean isCompositeComponent(UIComponent component) {

    if (component == null) {
        throw new NullPointerException();
    }
    boolean result = false;
    if (null != component.isCompositeComponent) {
        result = component.isCompositeComponent.booleanValue();
    } else {
        result = component.isCompositeComponent =
                (component.getAttributes().containsKey(
                           Resource.COMPONENT_RESOURCE_KEY));
    }
    return result;

}

因此,它由一个组件属性的存在来标识,该属性的名称由其定义,Resource.COMPONENT_RESOURCE_KEY其值为"javax.faces.application.Resource.ComponentResource".

于 2013-08-16T11:53:09.353 回答