2013-10-25 6 views
0

У меня есть два экземпляра: selectOneListbox которые ссылаются на эту же собственность в управляемом компоненте. Оба списка относятся к разным формам.selectOneListbox из другой формы не выбирается в первый раз

Когда после выбора позиции в одном из списков я выбираю один в другом, он не выбирается, только в первый раз; дальнейшие выборы все прекрасны.

Пожалуйста, советую решить проблему.

JSF

<h:form> 
      <ul style="list-style: none"> 
       <li> 
        <h:selectOneListbox size="1" value="#{adminController.model}" > 
         <f:ajax event="valueChange" render="@all"/> 
         <f:selectItems value="#{adminController.gtSelectItem()}" var="p" itemValue="${p.name}" itemLabel="${p.name}"/> 
        </h:selectOneListbox>  
       </li>  
      </ul> 
     </h:form> 
     <h:form> 
      <ul> 
       <li> 
        <h:selectOneListbox size="1" value="#{adminController.model}" > 
         <f:ajax event="valueChange" render="@all"/> 
         <f:selectItems value="#{adminController.gtSelectItem()}" var="p" itemValue="${p.name}" itemLabel="${p.name}"/> 
        </h:selectOneListbox>  
       </li> 
       <h:commandButton value="Print"> 
        <f:ajax event="click" listener="#{adminController.printAjax()}"/> 
       </h:commandButton> 
      </ul> 

     </h:form> 
    </div> 

Managed Bean недвижимость

public String getModel() { 
    return model; 
} 

public void setModel(String model) { 
    this.model = model; 
} 

SelectItems

public ArrayList<Product> gtSelectItem() { 
    ArrayList<Product> als = new ArrayList<>(pc.getProductList()); 
    return als; 
} 
+0

Вы уверены, что вам нужно иметь два компонента, ссылающихся на то же свойство? Возможно, есть другой способ, который даст вам то, что вам нужно. Чего вы хотите достичь? –

+0

Привет, его часть панели управления. У меня есть несколько форм, позволяющих добавлять, удалять и редактировать продукты. Удобно иметь все поля, которые сразу заполняются данными, независимо от того, какой вариант списка выбран. Когда я вставляю эти selectOneListboxes внутри одной формы, все работает как шарм. – max3d

ответ

0

У вас есть много вещей, чтобы решить т Вот. Прежде всего, префиксы геттера и сеттера не записываются при использовании EL. Просто используйте value="#{adminController.selectItem}", когда у вас есть свойство читать/писать. Ваш код предоставлен неверно, и ul и li теги не являются необходимыми для воспроизведения проблемы.

Appart from the, не использовать render="@all". Обычно считается, что плохая практика снова отображает всю страницу, используя ajax. Для этого просто выполните стандартный запрос POST. В вашем случае, вы можете сделать только другую форму, или даже лучше, компонент, который вы особенно заинтересованы в.

Здесь вы испытанный SSCCE о вашей проблеме, которая работает ;-)

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:f="http://java.sun.com/jsf/core"> 
<h:head> 
    <title>Test page</title> 
</h:head> 
<h:body> 
    <h:form id="form1"> 
     <h:selectOneListbox size="1" value="#{adminController.model}"> 
      <f:ajax event="valueChange" render=":form2" /> 
      <f:selectItems value="#{adminController.selectItem}" var="p" 
       itemValue="${p.name}" itemLabel="${p.name}" /> 
     </h:selectOneListbox> 

    </h:form> 
    <h:form id="form2"> 
     <h:selectOneListbox size="1" value="#{adminController.model}"> 
      <f:ajax event="valueChange" render=":form1" /> 
      <f:selectItems value="#{adminController.selectItem}" var="p" 
       itemValue="${p.name}" itemLabel="${p.name}" /> 
     </h:selectOneListbox> 
     <h:commandButton value="Print"> 
      <f:ajax event="click" listener="#{adminController.printAjax}" /> 
     </h:commandButton> 

    </h:form> 
</h:body> 
</html> 
@ManagedBean 
@ViewScoped 
public class AdminController implements Serializable { 

    public AdminController() { 
     System.out.println("Bean created"); 
    } 

    public class Product { 

     public String getName() { 
      return name; 
     } 

     public void setName(String name) { 
      this.name = name; 
     } 

     String name; 

     public Product(String name) { 
      this.name = name; 
     } 

    } 

    String model; 

    public String getModel() { 
     return model; 
    } 

    public void setModel(String model) { 
     this.model = model; 
    } 

    public List<Product> getSelectItem() { 
     return Arrays.asList(new Product("Prod1"), new Product("prod2")); 
    } 

    public void printAjax() { 
     System.out.println("Printing " + model); 
    } 
} 
+0

спасибо, и есть ли ресурс с «лучшими практиками для ajax для JSF?» – max3d

+0

Вы можете посмотреть онлайн-учебники или посмотреть здесь ответы @BalusC, они всегда так полезны. Если ответ был полезен для вас, отметьте поток как ответ (✓ отметьте в левой части ответа). –