2015-01-06 13 views
2

我使用的<p:commandButton>標記具有更新屬性並將更新屬性中的當前元素ID傳遞爲currentForm: messages。如:update="currentForm: messages"。消息是<div>元素的id,我希望在請求調用後更新元素。JSF自定義組件中的更新屬性需要完整的元素ID路徑,因爲直接PrimeFaces組件使用較短的元素ID路徑運行

這工作正常。

現在我使用與主模板中相同的命令按鈕創建了一個複合組件,並用創建的自定義命令按鈕替換了PrimeFaces命令按鈕。 (目前沒有中創建命令按鈕所做的任何自定義更改正當壯年的面孔命令在該按鈕)

當我呈現的是抱怨我對給定的ID更新模板屬性錯誤給出如下:

javax.faces.FacesException: Cannot find component with expression "currentForm 

如果我給這個元素的完整元素ID路徑,它再次工作。

雖然如果我們給元素的完整元素ID路徑是好事,但是讓我驚訝的是爲什麼當我調用直接PrimeFaces命令按鈕時它工作正常?

回答

2

這是因爲複合組件像<h:form>,<h:dataTable>等也命名容器。他們對ajax客戶端ID的影響在以下相關問題中有概述:How to find out client ID of component for ajax update/render? Cannot find component with expression "foo" referenced from "bar"

這樣做是因爲在複合組件組件的實現中,如果在同一個命名容器父項中多次重複使用複合組件,則會出現「複製組件ID」錯誤。另請參閱以下相關問題:Should a composite component really require namingcontainer interface?

如果您絕對肯定複合組件對於具體需求是正確的解決方案,並且因此不是標記文件(很多初學者由於其零配置特性而過度使用複合組件,while it should really best only be used if you intend to bind a single model property to a bunch of closely related components),則可以考慮以下的替代方式來更新消息分量:

  1. 要麼動態傳遞目標客戶端ID:

    <my:compositeButton ... update=":#{messages.clientId}" /> 
    ... 
    <p:messages binding="#{messages}" ... /> 
    

    (注:the code is as is; you don't need to bind it to a bean property or so!

  2. 或者只是讓PrimeFaces自動更新每個Ajax請求的消息組件:

    <my:compositeButton ... /> 
    ... 
    <p:messages autoUpdate="true" ... />