单击按钮可以显示更多字段(无限制)

时间:2012-03-15 12:34:19

标签: xpages

我想从x开始。在xpage应用程序(比如10对)上的字段(在我的应用程序中我有一对文本数据字段和数字数据字段)然后当用户点击"更多字段"时,我想要更多对在页面上没有完全刷新的情况下动态显示,但希望无限制。字段(只要页面没有崩溃)然后我想提交所有这些字段的表单和数据。实现这个目标的最佳方法是什么?

3 个答案:

答案 0 :(得分:16)

通常,字段使用点表示法绑定到文档数据源:

<inputText value="#{contact.firstName}" />

但是,也支持数组表示法:

<inputText value="#{contact['firstName']}" />

因为后一种语法中的字段名称被视为字符串,而不是bean的隐式属性,所以可以动态计算它。我发现定义这些动态字段最简单的方法是为每个基本类型的字段创建一个自定义控件,并将每个字段定义为接受数据源和字段名称。因此,字段本身最终会得到类似于以下内容的语法:

<inputText value="#{compositeData.dataSource[compositeData.fieldName]}" />

通过使用该语法,可以使用任何复杂度的计算来确定要传递给自定义控件的字段名称。在您尝试完成的场景中,在围绕字段对的重复控件上指定indexVar将允许您为每个指定字段后缀...可能类似于以下内容:

<xp:repeat indexVar="fieldSuffix" value="#{viewScope.rowCount}">
 <xp:div>
  <xc:dynamicInputText dataSource="#{contact}" fieldName="fullName_#{fieldSuffix}" />
  <xc:dynamicInputNumber dataSource="#{contact}" fieldName="phoneNumber_#{fieldSuffix}" />
 </xp:div>
</xp:repeat>

使用这种方法,您最终会得到名为“fullName_0”,“fullName_1”等的字段,直到viewScope中指定的限制。通常,唯一的复杂因素是确保在打开现有文档时,将viewScope变量设置回正确的限制。当然,另一种方法实际上是将限制保存为文档中的另一个项目,并将重复值绑定到文档上。

答案 1 :(得分:3)

你也可以看一下练习23“Tablewalker”。它不会执行多个字段,但会执行多值字段,这些字段在处理和存储方面可能更好(您可以使用@Elements来查找文档中有多少字段)。练习在这里: http://www-10.lotus.com/ldd/ddwiki.nsf/dx/Tutorial-Introduction-to-XPages-Exercise-23 虽然按钮一次只添加一行,但很容易调整。

答案 2 :(得分:2)

你可以做的是拥有一个带有2个字符串值的Bean标签和数据以及一个拥有该对象的ArrayList的托管bean,因此在重复控件内部,您可以将重复绑定到ArrayList,然后将xp:inputText绑定到rowData.Data和你的xp:标签到rowData.Label然后当你想添加另外5行你刚添加但是更多的对象进入ArrayList然后刷新你的页面,你的数据仍将存在于你的arraylist中你将有5个新的空对象,您可以在其中添加数据。

public class Data {

private String label;
private String data;

public Data() {

}
//getters and setters

}

public class ManagedBean {

private ArrayList<Data> datalist;  // add a managed property for this one so It will create a new one when needed.

// getters and setters

public addFiveMoreObjects() {
   Data newItem;
   for (int i=0; i<5; i++) {
       newItem = new Data();
       datalist.add(newItem);
   }
}

}

<xp:repeat value="#{managedBean.datalist}" var="rowData">
<xp:text value="#{rowData.label}" />
<xp:inputText value="#{rowData.data} />
</xp:repeat>

<xp:button value="Add 5 More"> // call #{managedBean.addFiveMoreObjects}