我在使用似乎维护其状态的组件时遇到了一些困难(渲染,只读,禁用,......属性)。
基本上,我有一个自定义组件(扩展UIComponentBase),它有一个属性:readOnly。如果这是真的,则所有子项都是只读的,如果为false,则组件根本不执行任何操作。这在单页上非常有效。
@FacesComponent(value = "xxPanel")
public class Panel extends UIComponentBase {
@Override
public String getFamily() {
return "b.z.x.Panel";
}
@Override
public void encodeBegin(FacesContext context) throws IOException {
Boolean readOnly = (Boolean) getAttributes().get("readOnly");
if (readOnly != null && readOnly) {
processViewTree(this, readOnly);
}
}
private void processViewTree(UIComponent component, boolean setTo) {
for (UIComponent child : component.getChildren()) {
if (EditableValueHolder.class.isAssignableFrom(child.getClass())) {
if (child instanceof UISelectOne || child instanceof UISelectMany) {
callMethod(child, "setDisabled", setTo);
}
callMethod(child, "setReadOnly", setTo);
}
processViewTree(child, setTo);
}
}
private boolean callMethod(UIComponent component, String name, boolean setTo) {
Method method = component.getClass().getMethod(name, boolean.class);
method.invoke(component, setTo);
return true;
}
}
但是,当我使用ajax调用重新呈现@form(或另一个父组件)时,readOnly属性的计算结果为false,那么我的子项不会再次启用。因此,在这种情况下,JSF似乎没有重新评估组件本身的只读属性值。
我认为这是因为组件保留状态......但是非常欢迎任何关于如何解决此问题的指针!