2015-06-22 2 views
0

Я хотел бы достичь следующих потребительной случае -JSF-Primefaces PickList обновление каждый клик на вкладке

<p:tabView id="top-level-tab"> 
      <p:tab title="TabA" id="tab-A"> 
       <ui:include src="tabA.xhtml" />    
      </p:tab> 
      <p:tab title="TabB" id="tab-B"> 
       <ui:include src="tabB.xhtml" /> 
      </p:tab> 
</p:tabView> 

форма вкладки-А представляет некоторые значения и сохраняется в БД. При нажатии кнопки Tab-B последнее значение сохраняется в PickList на вкладке -B. JSF создает дерево представлений и получает кеширование на стороне сервера, это не приводит к обновлению списка выбора в вкладке -B. Ищет помощь от опытных разработчиков JSF-Prime, так как я очень новичок в JSF-Primefaces.

tabB.xhtml

<h:form id="tabBForm"> 

<p:pickList id="tabBPickList" value="#{tabBController.countries}" var="countries" itemLabel="#{countries}" itemValue="#{countries}" required="true"/> 

<p:commandButton value="Submit" update="tabBForm"/> 

</h:form> 
+1

Почему вы не явно обновить конкретные компоненты на другой вкладке? – Kukeltje

ответ

0

Попробуйте установить атрибут кэша в TabView ложь.

<p:tabView id="top-level-tab" cache="false"> 

Цитата primefaces документации:

Когда вкладка содержимое ленивы загружены АЯКС toggleMode, кэширование только извлекает вкладку содержимое раз и последующие переключатели на вкладке кэшированных не обменивается данными с сервером. Если кеширование отключено, содержимое вкладки перезагружается с сервера при каждом нажатии на вкладку.

0

Как уже предложенное Kukeltje в комментариях, добавив update="..." атрибут <p:commandButton ...> в виде А (тот, который сохраняется в БД) следует сделать трюк.

Я проверил это в следующем коде, и она работает:

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://xmlns.jcp.org/jsf/html" 
     xmlns:p="http://primefaces.org/ui"> 
    <h:head> 
     <title>Facelet Title</title> 
    </h:head> 
    <h:body> 
     <p:tabView id="tabView"> 
      <p:tab title="TabA" id="tab-A"> 
       <h:form id="tabAForm"> 
        <p:outputLabel for="country" value="Enter country name" /> 
        <p:inputText id="country" value="#{tabAController.countryName}" /> 
        <p:commandButton value="Save" action="#{tabAController.saveCountry}" update="tabView:tabBForm:tabBPickList" /> 
       </h:form> 
      </p:tab> 
      <p:tab title="TabB" id="tab-B"> 
       <h:form id="tabBForm"> 
        <p:pickList id="tabBPickList" value="#{tabBController.countries}" var="countries" itemLabel="#{countries}" itemValue="#{countries}" /> 
        <p:commandButton value="Submit" /> 
       </h:form> 
      </p:tab> 
    </p:tabView> 
    </h:body> 
</html> 

Резервным боб Nr 1:

import javax.enterprise.context.RequestScoped; 
import javax.inject.Named; 

@Named (value = "tabAController") 
@RequestScoped 
public class TabAController { 

    private String countryName; 

    public String saveCountry() { 
     CountryDAO dao = new CountryDAO(); 
     Country country = new Country(); 
     country.setCountryName(countryName); 
     dao.saveCountry(country); 
     return ""; 
    } 

    public void setCountryName(String countryName) { this.countryName = countryName; } 
    public String getCountryName() { return countryName; } 
} 

Резервного боб NR 2:

import java.util.ArrayList; 
import java.util.List; 
import javax.enterprise.context.RequestScoped; 
import javax.inject.Named; 
import org.primefaces.model.DualListModel; 

@Named 
@RequestScoped 
public class TabBController { 

    private DualListModel<String> countries; 

    public TabBController() { 
     CountryDAO dao = new CountryDAO(); 
     List countriesObj = dao.getCountries(); 
     List<String> countriesSource = new ArrayList(); 
     for(Object country : countriesObj) { 
      Country tmp = (Country) country; 
      countriesSource.add(tmp.getCountryName()); 
     } 
     List<String> countriesTarget = new ArrayList(); 
     countries = new DualListModel(countriesSource, countriesTarget); 
    } 

    public void setCountries(DualListModel<String> countries) { this.countries = countries; } 
    public DualListModel<String> getCountries() { return countries; } 
} 
Смежные вопросы