是否可以使用JSF ajax更新非JSF组件(纯HTML)?

时间:2012-10-22 10:10:08

标签: html ajax jsf jsf-2

是否可以更新我的页面中不是JSF组件的部分?

例如,我可以更新纯HTML <div>还是需要将其包装在JSF组件中?

3 个答案:

答案 0 :(得分:24)

  

是否可以更新我的页面中不是JSF组件的部分?

没有。要更新的组件必须由UIViewRoot#findComponent()提供,以便JSF可以找到它们,在其上调用encodeAll(),捕获生成的HTML输出并将其传回ajax响应中,以便JavaScript可以用它更新HTML DOM树。纯HTML元素在JSF组件树中没有表示为真实的UIComponent实例,因此JSF已经无法在第一时间找到它们。


  

例如,我可以更新纯HTML <div>还是需要将其包装在JSF组件中?

您需要将其包装在像<h:panelGroup>这样的JSF组件中。但是,您可以使用<h:panelGroup layout="block">来表示JSF中的真实<div>。这样您就不需要将<div>包装在另一个JSF组件中。

<h:panelGroup layout="block" id="foo">
    ...
</h:panelGroup>

从JSF 2.2开始,您可以使用带有jsf:id属性的新passthrough elements功能将HTML(5)元素声明为JSF组件。

<... xmlns:jsf="http://xmlns.jcp.org/jsf">

<div jsf:id="foo">
    ...
</div>

<main jsf:id="bar">
    ...
</main>

<section jsf:id="baz">
    ...
</section>

他们将按原样呈现他们的输出,但在封面下是一个具体的UIPanel实例。

composite components的情况下有一个角落案例。您可以使用以下方法来获取ajax可以更新 的HTML元素。

<cc:implementation>
    <span id="#{cc.clientId}">
        ...
    </span>
</cc:implementation>

此方法有效的解释是因为即使复合组件将自身呈现为HTML输出, 本身也可由UIViewRoot#findComponent()提供

另见:

答案 1 :(得分:1)

好像你不能。

更新某些内容将其包装在'可更新'组件中(在primeaces p:outputpanel中)并更新该组件。

添加:在您的特殊情况下,您可以刷新p:树的子项:JSF update primefaces tree children

(哈哈总是想以第三人称与我交谈)

答案 2 :(得分:-2)

AFAIK您可以通过ID更新组件,并且由于常规元素可以有ID,因此只要您获得ID正确就可以; - )