在 JSF 2 中,内置的 ajax 标记允许预定义的关键字选择渲染或执行目标。例如:
<f:ajax execute="@form" render="@this" />
是否有任何简单的方法可以在自定义组件中重用选择器代码?例如:
<f:mycustomcomponent update="@form" />
没有标准的 JSF API,原因很简单,它们是由jsf.js
脚本文件在客户端处理的。JSF ajax JavaScript 替换@form
byelement.form.id
和@this
byelement.id
等等。目前还不清楚你到底需要它做什么,但如果你基本上需要将它传递给jsf.ajax.request()
,那么你实际上不需要自己操作它。
但是,如果您出于某种原因确实需要它来引用组件树中的某些 JSF 组件,那么您最好的选择是真正自制它。假设你在一个UIComponent
中,这是一个启动示例(请记住,它可以包含多个值,以空格分隔)
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
实用程序类复制)
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);
}