一尘不染

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

html

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

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


阅读 253

收藏
2020-05-10

共1个答案

一尘不染

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

否。待更新组件必须由提供UIViewRoot#findComponent(),以便JSF可以找到它们,对其进行调用encodeAll(),捕获生成的HTML输出,并将其传递回ajax响应,以便JavaScript可以使用它更新HTMLDOM树。 。纯HTML元素未UIComponent在JSF组件树中表示为真实实例,因此JSF已经无法首先定位它们。


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

您需要将其包装在JSF组件中,例如<h:panelGroup>。但是,您可以仅使用JSF中<h:panelGroup layout="block">的real来表示<div>。这样,您无需将包裹<div>在另一个JSF组件中。

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

从JSF 2.2开始,您可以使用带有属性的新直通元素功能jsf:id将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实例。

但是,在复合组件的情况下有一个极端的情况。你可以用下面的办法有一个HTML元素,其 通过AJAX更新。

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

这种方法行之有效的解释是,即使复合组件 没有 将其自身呈现到HTML输出,也 可以
通过本身获得UIViewRoot#findComponent()

2020-05-10