2013-04-29 84 views
3

我想在Primefaces数据表中添加一个新行,那么我想提交此表的内容,并做一些业务逻辑。数据表模型是在ViewScoped托管bean中维护的集合。添加一个新行到一个p:数据表,然后提交内容

我使用JSF 2.1 Primefaces 3.3。

短的例子:

<h:form id="my-form"> 
     <p:dataTable value="#{testBean.list}" var="s" id="datatable"> 
      <p:column> 
       <h:inputText value="#{s}"/> 
      </p:column> 
      <f:facet name="footer"> 
       <p:commandButton value="Add row" action="#{testBean.addRow()}" process="@form" update="@form" immediate="true" /> 
       <p:commandButton value="Do stuff" action="#{testBean.doSomeLogic()}" process="@form" update="@form"/> 
      </f:facet>  
     </p:dataTable> 
    </h:form> 

托管Bean:

@ManagedBean 
@ViewScoped 
public class TestBean implements Serializable { 

private List<String> list; 

public TestBean() { 
} 

@PostConstruct 
public void init() { 
    list = new ArrayList<String>(); 
    list.add("one"); 
    list.add("two"); 
} 

public void addRow(){ 
    list.add(new String()); 
} 

public void doSomeLogic(){ 
    for (String string : list) { 
     System.out.println(string); 
    } 
} 

// getters and setters 

} 

实际发生的: “添加行” 按钮

  • 用户点击,一个新的行被添加(我需要立即成为真实的,所以没有进行验证,这些字段是更大形式的一部分)。
  • 用户点击“做的东西”,收集有大小合适(新行),但用户的输入在不考虑(既不修改前退出行,也不是新加入行新值)。

我能做些什么太提交新的价值观?我只是开始JSF,我不知道我已经100%得到它。

感谢您的帮助。

可能的重复:

编辑:问题就解决了由于Jitesh,工作示例可以在这里找到:JSF2, can I add JSF components dynamically?

回答

1

唯一的问题是您在使用不可变对象的inputText。为了低于这个检查结果BaluC's Answer

根据它“作为一个不可变的对象,字符串没有setter方法,将永远不能设置输入的值。

尝试从commandButton中删除即时属性,您会发现在插入每行时数据将被清除。

+0

感谢您指点我正确的方向,我删除了immediate属性,并使用了一个bean而不是String,并且做到了这一点。 – Virginie 2013-05-06 06:44:18

+0

顺便说一句,你的链接是坏的,正确的一个[这里](http://stackoverflow.com/questions/12690850/adding-inputtext-elements-dynamically-to-a-bound-datatable-empties-other-inputte) – Virginie 2013-05-06 06:49:43

+0

确定我已更新此帖子中的链接。 – Jitesh 2013-05-06 07:05:37

0

如果我理解正确,表单中的其他地方有一些验证失败。当任何提交的表单值未通过验证时,除非使用immediate,否则所有提交的值都不会应用于托管bean。这就是为什么你可以添加一个新行,但不能用doStuff方法。您没有将immediate添加到doStuff

但指出有一些事情你可以做更简洁高效。

首先,action属性应该被用于导航操作。 JSF期望绑定到action的方法具有表示导航结果的返回值。对于void方法,最好使用actionListener。有关actionactionListener之间的区别更多的信息,请阅读这里:Differences between action and actionListener

其次,为什么不设置processupdate只有数据表组件,然后你就不必担心其他形式的验证?这里有一个例子:

<h:form id="my-form"> 
    <p:dataTable value="#{testBean.list}" var="s" id="datatable"> 
     <p:column> 
      <h:inputText value="#{s}"/> 
     </p:column> 
     <f:facet name="footer"> 
      <p:commandButton value="Add row" actionListener="#{testBean.addRow}" 
       process=":my-form:datatable" update=":my-form:datatable" /> 
      <p:commandButton value="Do stuff" actionListener="#{testBean.doSomeLogic}" 
       process=":my-form:datatable" update=":my-form:datatable" /> 
     </f:facet> 
    </p:dataTable> 
</h:form> 
+0

在我的真实代码中有验证,但在我的示例中没有,我尝试解决此问题。因此,在这个例子中'process =“@ form”'=='process =“:my-form”'。基本上你的代码和我的代码完全一样(我测试过,同样的问题;点击“做东西”,没有提交新的数据)。感谢您的关于actionListener和行动的建议:) – Virginie 2013-04-29 12:54:39

相关问题