JSF 2.0 Получить список идентификаторов клиентов в управляемом компоненте

Есть ли способ получить список всех идентификаторов клиентов содержимого определенного div внутри управляемого компонента? У меня есть идентификатор клиента div. Я должен вызвать resetValue(...) для каждого компонента внутри div.

FacesContext.getCurrentInstance().getViewRoot().findComponent(...) даст мне один компонент, если я укажу идентификатор клиента. Я не хочу использовать его, потому что у меня много компонентов внутри div, и у меня будет около 100 строк кода только для сброса одного div.

Могу ли я получить список идентификаторов cient, чтобы я мог перебирать этот список и сбрасывать все компоненты? Я также открыт для других подходов, если я могу сбросить все компоненты внутри div. Мой компонент управляется Spring (scope("view")). Я использую a4j:commandButton для отправки значений этому компоненту. Когда я снова загружаю страницу, я вижу ранее отправленные значения, что неверно. Я попробовал resetValue(...) для одного компонента внутри div после отправки, и он сбросил значения компонента. Любая помощь приветствуется.

Пример кода:

xhtml:

<a4j:outputPanel id="EditSeaPage">
    <a4j:outputPanel id="editSeaContainer"
    rendered="#{seaBean.showEditSea}" layout="block"
    styleClass="switch-section">

        <h:panelGroup>
        <h:outputLabel value="#{messageSource.sea_label}" />
        <h:inputText id="updateSeaCode"
         value="#{seaBean.seaUIDTO.seaCode}"
         styleClass="user-detail">
         <a4j:ajax />
        </h:inputText>
    </h:panelGroup>
    <a4j:commandButton id="confirmUpdateSeaCode" execute="@this"
     action="#{seaBean.updateSeaCode}" render="parentContainer"/>
</a4j:outputPanel>
</a4j:outputPanel>

Родительский xhtml:

<a4j:commandLink id="editSeaCode" value="edit"  onclick="hideMe()" render="editPortContainer"/>

Bean:

public String updateSeaCode() {
//does update
UIInput input = (UIInput) FacesContext.getCurrentInstance().getViewRoot().findComponent("updateSeaCode");
  input.resetValue();
   //This works. But I have around 20 input components in the above XHTML and can't write the //above code for each component
}

Я просто добавил скелет того, что я делаю. Как я могу убедиться, что представление обновляется после завершения вызова? Чтобы дать мне больше деталей, вот как это работает: у меня есть ссылка edit, которая является a4j:commandLink. При нажатии на эту ссылку я скрываю ссылку и отображаю editSeaContainer. Если вы видите, что есть визуализированный атрибут. Как только я нажимаю на ссылку edit, я скрываю ссылку, используя jQuery, и делаю a4j:jsFunction, чтобы установить для логического свойства значение true, чтобы эта страница отображалась. После a4j:jsFunction я вызываю метод fetch для извлечения содержимого этого xhtml. К моменту завершения метода логическое значение устанавливается, и атрибут 'render' отображает страницу. Все в порядке, пока здесь. Но входные значения не обновляются с извлеченными значениями.

Спасибо.


person Teena George    schedule 21.03.2014    source источник
comment
Если вы работаете с Ajax (как кажется) и визуализируете список в своем ответе, просто очистите сопоставленные поля значений в вашем bean-компоненте. Это означает вид client.setValue("").   -  person Xtreme Biker    schedule 21.03.2014
comment
Если вы имели в виду очистку значений в компоненте, я уже сделал это, и это не помогает. Значения корректно заполнены в bean-компоненте, но в представлении по-прежнему отображаются старые значения.   -  person Teena George    schedule 21.03.2014
comment
Тогда это потому, что представление не обновляется, когда заканчивается вызов ajax. Но поскольку вы не предоставили еще один пример своего кода, я не могу сделать вывод, что происходит не так.   -  person Xtreme Biker    schedule 21.03.2014
comment
Используйте атрибут render для a4j:commandButton: ‹a4j:commandButton id=confirmUpdateSeaCode action=#{seaBean.updateSeaCode} render=EditSeaPage /›   -  person Vasil Lukach    schedule 21.03.2014
comment
Я только что отредактировал фрагмент кода, чтобы вы получили более четкое представление о том, что я делаю. Я использовал атрибут рендеринга, но это помогает только при рендеринге div/a4j:outputPanel. Это по-прежнему не помогает в обновлении значений входных компонентов.   -  person Teena George    schedule 21.03.2014
comment
Я также заметил, что все компоненты вывода правильно отображают значения. Проблема только с входными компонентами.   -  person Teena George    schedule 21.03.2014


Ответы (1)


Что касается JSF, самый простой способ получить список идентификаторов дочерних элементов компонента — это использовать UIComponent#getChildren(), а затем выполнить итерацию по возвращенному списку для выполнения сброса:

    HtmlPanelGrid yourDiv = facesContext.getViewRoot().findComponent("theDivId");//facesContext is an instance of FacesContext
    List<UIComponent> children = yourDiv.getChildren();

        for(UIComponent child: children){

          if(child instanceof UIInput){ //resetValue is applicable only to input comps.
               ((UIInput)child).resetValue();
          }    
        } 

Более быстрый способ сбросить значения на всей странице — вызвать тот же метод для экземпляра UIViewRoot, связанного с этой страницей, что и в следующем примере:

    FacesContext ctxt = FacesContext.getCurrentInstance();
    UIViewRoot viewRoot = ctxt.getViewRoot();
    viewRoot.resetValues(ctxt,listOfIds);

Где listOfIds относится к Collection<String> идентификаторам clientId, принадлежащим компонентам, для которых вы хотите выполнить сброс. Очевидно, это требует, чтобы у вас были идентификаторы компонентов заранее.


JSF 2.2 представил тег <f:resetValues/> (и атрибут resetValues в теге <f:ajax/>) для решения этой конкретной проблемы.

person kolossus    schedule 23.03.2014
comment
Спасибо! Это то, что я искал. Я использую JSF 2.1.13 и не могу попробовать <f:resetValues/>, хотя это кажется более привлекательным. - person Teena George; 24.03.2014
comment
Просто хотел указать, что синтаксис неверен в первом фрагменте кода. FacesContext.getCurrentInstance().getViewRoot().findComponent("theDivId"); - person Teena George; 25.03.2014