在ajax渲染上重置JSF组件的已保存状态

时间:2017-01-28 19:26:48

标签: jsf primefaces jsf-2.2

我在使用似乎维护其状态的组件时遇到了一些困难(渲染,只读,禁用,......属性)。

基本上,我有一个自定义组件(扩展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似乎没有重新评估组件本身的只读属性值。

我认为这是因为组件保留状态......但是非常欢迎任何关于如何解决此问题的指针!

0 个答案:

没有答案