2012-02-27 38 views
1

我有一個簡單的表單並在另一個輸入字段更改後重新顯示一個輸入字段,但ajax呈現的輸入字段的值永遠不會發布到我的@ ViewScoped bean。它始終爲空,而所有其他值將被正確傳輸。JSF 2 + Richfaces 4 + Seam 3:發送帶有Ajax呈現輸入字段的表單

<h:form id="userAddForm"> 
      <div> 
       <h:outputLabel for="userRole" value="role" /> 
       <h:selectOneMenu id="userRole" value="#{addUser.role}"> 
        <f:selectItems value="#{addUser.userRoles}" /> 
        <a4j:ajax event="valueChange" render="optionalIn" execute="@this" /> 
       </h:selectOneMenu> 
      </div> 

...

<a4j:outputPanel id="optionalIn" layout="block"> 
<div> 
      <h:panelGroup rendered="#{addUser.role eq 'MERCHANT'}"> 

         <h:outputLabel for="service" value="service url" /> 
         <h:inputText id="service" value="#{addUser.service}" 
          style="width: 175px;" > 
         </h:inputText> 

      </h:panelGroup> 
      </div>  
     </a4j:outputPanel> 


     <div class="buttonBox"> 
      <h:commandButton render="@form" execute="@form" id="save" action="#{addUser.save}" value="Save" /> 
      <h:commandButton id="cancel" value="Cancel" 
       action="#{addUser.cancel}" immediate="true" /> 
     </div> 


    </h:form> 

豆子:

@ViewScoped 
public class AddUser implements Serializable { 

    @Inject 
    private UserHelper userHelper; 

    @Inject 
    private Messages messages; 

    private User newUser; 
    private UserRole role; 
    private List<UserRole> userRoles = new ArrayList<UserRole>(); 
    private String service; 

    @PostConstruct 
    public void init(){ 
     if(userRoles.isEmpty()){ 
      userRoles.add(UserRole.ADMIN); 
      userRoles.add(UserRole.CUSTOMER); 
      userRoles.add(UserRole.MERCHANT); 
     }; 
     setRole(userRoles.get(1)); 
     System.out.println("create"); 
    } 

    public User getNewUser() { 
     return newUser; 
    } 

    public void setNewUser(User newUser) { 
     this.newUser = newUser; 
     System.out.println("set User"); 
    } 

    public void setRole(UserRole role) { 
     System.out.println("role" + role); 

     this.role = role; 
     if (role.equals(UserRole.CUSTOMER)) { 
      newUser = new Customer(); 
     }else if(role.equals(UserRole.MERCHANT)){ 
      newUser = new Merchant(); 
     }else if(role.equals(UserRole.ADMIN)){ 
      newUser = new Admin(); 
     } 
    } 

    public UserRole getRole() { 
     if (role == null) { 
      role = UserRole.ADMIN; 
     } 
     return role; 
    } 

    public List<UserRole> getUserRoles() { 
     return userRoles; 
    } 

    public String getService() { 
     return service; 
    } 

    public void setService(String service) { 
     this.service = service; 
     System.out.println("set url"); 
    } 

    public String save() { 
     newUser.setPin(SHAHelper.StringToSHA256(newUser.getPin())); 
     if (role.equals(UserRole.CUSTOMER)) { 
      userHelper.addUser(newUser); 
     }else if(role.equals(UserRole.MERCHANT)){ 
      ((Merchant) newUser).setServiceUrl(service); 
      userHelper.addUser(newUser); 
     }else if(role.equals(UserRole.ADMIN)){ 
      userHelper.addUser(newUser); 
     } 

     return "/page/admin/userList.xhtml?faces-redirect=true"; 
    } 

    public String cancel() { 
     return "/page/admin/userList.xhtml?faces-redirect=true"; 
    } 

的setService方法永遠不會被調用。我不明白爲什麼?

回答

0

可能會晚點,但是你已經在你的模板如下:

rendered="#{addUser.role eq 'MERCHANT'}" 

,並在你的初始化您有:

if(userRoles.isEmpty()){ 
     userRoles.add(UserRole.ADMIN); 
     userRoles.add(UserRole.CUSTOMER); 
     userRoles.add(UserRole.MERCHANT); 
    }; 
    setRole(userRoles.get(1)); 

所以實際上,我可以看到角色是客戶,讓您的領域對於

value="#{addUser.service}" 

從未呈現