2013-10-16 23 views
3

当提及Post的标题时,我试图从ui:repeat内部的h:inputText中更新ArrayList的值,该值不起作用。
请参看下面的实物模型做进一步的了解:在ui中使用inputText:重复更新ArrayList的值不起作用

我有一个POJO类,如下所示:

public class User implements Serializable{ 
    private String name; 
    private List<String> emails; 

    public User(String name, List<String> emails) { 
     super(); 
     this.name = name; 
     this.emails = emails; 
    } 
    //Setters Getters 
} 

在我的经理,我已经创建了用户的POJO名单:

@ManagedBean 
@ViewScoped 
public class UserManager implements Serializable { 
    private List<User> userList; 
    public UserManager() { 
     userList = new ArrayList<User>(); 
     ArrayList<String> emails= new ArrayList<String>(); 

     emails.add("[email protected]"); 
     emails.add("[email protected]"); 
     userList.add(new User("User1", (List<String>) emails.clone())); 

     emails.clear(); 
     emails.add("[email protected]"); 
     emails.add("[email protected]"); 
     userList.add(new User("User2", (List<String>) emails.clone())); 
    } 
    public void action(){ 
    for(User u : userList){ 
     System.out.println(u); 
    } 
} 
    //Setters Getters 
} 

现在在我的Facelet中,我使用ui:repeat将数据加载到h:inputText中,以便用户可以编辑和更改这些值。 的facelet代码:

<h:form id="userForm"> 
    <table border="1"> 
     <ui:repeat var="user" value="#{userManager.userList}"> 
      <tr> 
       <td><h:inputText value="#{user.name}"/> </td> 

       <ui:repeat var="email" value="#{user.emails}"> 
        <td><h:inputText value="#{email}"/> </td> 
       </ui:repeat> 
      </tr> 
     </ui:repeat> 
    </table> 

    <h:commandButton value="Save" action="#{userManager.action}"> 
     <f:ajax execute="@form @this"/> 
    </h:commandButton> 
</h:form> 

上述方法,当我编辑#{user.name}但它不与#{email}工作的正常工作。
我可以假定它的工作#{user.name},因为name有setter和getter方法。
那么如何更新emails列表对象。
我的POJO设计很差吗?或者使用ui:repeat不好主意?
我该如何做到这一点?

注:我目前钻嘴鱼科的版本是2.1

+0

你是不是能够看到电子邮件列表还是什么? – BholaVishwakarma

回答

4

由于BalusC报道hereString是不可改变的。使用varStatus属性直接通过索引访问列表成员。

<ui:repeat varStatus="loop" value="#{user.emails}"> 
    <td><h:inputText value="#{user.emails[loop.index]}"/> </td> 
</ui:repeat> 

随着BigDecimals的:

<ui:repeat varStatus="loop" value="#{user.numbers}"> 
    <td><h:inputText value="#{user.numbers[loop.index]}" converter="javax.faces.BigDecimal"/> </td> 
</ui:repeat> 
+0

它会适用于ArrayList内的任何类型吗? –

+0

那么如果你的输入的值被绑定到String以外的其他值,你需要一个转换器。 –

+0

好的谢谢你的答案,只是最后一个疑问。如果我有BigDecimal类型的列表? –