【问题标题】:JSF: Reusing f:ajax render/execute selectorJSF:重用 f:ajax 渲染/执行选择器
【发布时间】:2012-12-26 05:07:21
【问题描述】:

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

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

是否有任何简单的方法可以在自定义组件中重用选择器代码?例如:

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

【问题讨论】:

  • 我很难理解具体问题。您的具体问题是不是更多的是您正在寻找一个标准的 JSF API 方法调用,它将 @form 之类的伪客户端 ID 转换为 formId 之类的绝对客户端 ID?
  • 是的,这确实是我的问题。我只是举了一个例子,如果它实际上是一个 API,那么它已经在 J​​SF 中使用了。
  • 很遗憾,没有。
  • 嗯,这很可悲。他们已经对其进行了编码,不妨将其设为 API……感谢您对其进行研究。

标签: ajax jsf jsf-2


【解决方案1】:

没有标准的JSF API,原因很简单,它们是由jsf.js 脚本文件在客户端处理的。 JSF ajax JavaScript 将 @form 替换为 element.form.id 和 @this 替换为 element.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);
}

用这个小助手方法(复制自OmniFacesComponents 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);
}

【讨论】:

    猜你喜欢
    • 2012-01-25
    • 2011-05-07
    • 2017-04-12
    相关资源
    最近更新 更多