JSF:重用f:ajax渲染/执行选择器

时间:2013-01-11 15:21:42

标签: ajax jsf jsf-2

在JSF 2中,内置的ajax标记允许预定义的关键字选择渲染或执行 目标。 e.g:

<f:ajax execute="@form" render="@this" />

有没有简单的方法可以在自定义组件中重用选择器代码? e.g:

<f:mycustomcomponent update="@form" />

1 个答案:

答案 0 :(得分:2)

没有标准的JSF API,原因很简单,它是由jsf.js脚本文件在客户端处理的。 JSF ajax JavaScript将@form替换为element.form.id,将@this替换为element.id,依此类推。目前还不清楚你究竟需要它,但如果你基本上需要将它传递给jsf.ajax.request(),那么你实际上并不需要自己操纵它。

但是如果由于某种原因你实际上需要它来引用组件树中的一些JSF组件,那么最好的办法是自制它。如果您在UIComponent内,这里是一个启动示例(请记住,它可以包含多个值,spaceseparated)

if (update.charAt(0) != '@') {
    component = findComponent(update);
} else if (update.equals("@all")) {
    component = context.getViewRoot();
} else if (update.equals("@form")) {
    component = getClosestParent(this, UIForm.class);
} else if (update.equals("@none")) {
    component = null;
} else if (update.equals("@this")) {
    component = this;
} else {
    throw new IllegalArgumentException("Wrong update value " + update);
}

使用这个小助手方法(从OmniFaces Components utility class复制)

public static <T extends UIComponent> T getClosestParent(UIComponent component, Class<T> parentType) {
    UIComponent parent = component.getParent();

    while (parent != null && !parentType.isInstance(parent)) {
        parent = parent.getParent();
    }

    return parentType.cast(parent);
}