您的位置:首页 > 其它

7. 在XPages里怎么实现一次显示分类视图的一个类别

2012-12-04 17:30 281 查看
分类视图是Notes显示文档的独特和强大的功能。在客户端和传统Web开发中,有时会希望一次显示分类视图的一个类别,在这两种环境下,都很容易实现。XPages终于把Notes环境下的web开发现代化了。很多传统web开发中的问题都能够漂亮地解决。那我们就来看看如何在XPages里怎么实现一次显示分类视图的一个类别。

在XPages页面上分别创建一个下拉框和视图控件。下拉框用来切换要显示的类别,它的选项绑定分类视图的折叠起的分类列。视图控件也设置好基本属性。与在经典Notes开发中表单上的嵌入视图类似,视图控件在数据选项卡中也可以设置限制显示分类视图的某个类别。这时最直观的想法是将这个属性设置为下拉框的值。显示这个页面,在计算视图要显示的分类,即下拉框的值时出现错误。这可以推测理解为XPages引擎先解析页面上的数据源,即那个视图。在计算它的显示分类属性时,下拉框控件还没有准备好。

那我们就换一个思路,在下拉框的更换选项事件中,指定视图要显示的分类。在刚才的试验中,我们可以在视图数据源的属性中看到一个categoryFilter项,而view1又是XPages为这个视图数据源创建的服务器端JavaScript可以访问的全局对象,于是很自然地,我们就想到view1.setCategoryFilter()。奇怪的是,view1竟然没有提供这个方法。Designer为我们自动列出的view1的方法显示它是一个Java的lotus.domino.View接口,而不是作为数据源的XPages类库中的DominoView,DominoViewSource之类的什么东西,就像如果绑定一个文档数据源,document1会是DominoDocument而不是lotus.domino.Document。这一点很有意思,因为视图数据源的var属性,也就是将它作为JavaScript公布的对象名称就是view1,但是XPages引擎却将这个数据源对象隐藏起来,替换为它后端的View。

如此一来,我们想要得到真正的视图数据源对象,就要在脚本中计算页面使用到的数据源,然后再将它类型转换成DominoViewSource之类的什么东西。这又遇到了一个问题,在服务器端JavaScript中,虽然可以调用Java类库的各种方法,但是却不能进行强制类型转换。

这样看来,在传统的Notes开发中很容易实现的一项功能在Xpages中却变得不是那么直接。我们只好再利用一个中间人的角色,在下拉框的事件代码与视图数据源的属性之间增加一座桥梁。我们在下拉框的选项更换事件中将它的值保存到requestScope里,再将视图数据源的categoryFilter属性绑定为这个值。终于大功告成。

<xp:panel>
		<xp:comboBox id="Status" >
			<xp:selectItem itemLabel="All" itemValue="All"></xp:selectItem>
			<xp:selectItems>
				<xp:this.value><![CDATA[#{javascript:view1.getColumnValues(0);}]]></xp:this.value>
			</xp:selectItems>
			<xp:eventHandler event="onchange" submit="true"
				refreshMode="complete">
				<xp:this.action><![CDATA[#{javascript:var status:com.ibm.xsp.component.xp.XspSelectOneMenu = getComponent("Status");
viewScope.put("category", status.getValue());}]]></xp:this.action>
			</xp:eventHandler>
		</xp:comboBox>
	</xp:panel>
	<xp:viewPanel rows="15" value="#{view1}" id="viewPanel1"
		viewStyle="width:100%" target="_blank" pageName="/PO.xsp">
		<xp:this.facets>
			<xp:pager partialRefresh="true" layout="Previous Group Next"
				xp:key="headerPager" id="pager1">
			</xp:pager>
		</xp:this.facets>
		<xp:viewColumn columnName="Status" id="viewColumn1">
			<xp:viewColumnHeader value="Status"
				id="viewColumnHeader1">
			</xp:viewColumnHeader>
		</xp:viewColumn>
		<xp:viewColumn columnName="No" id="viewColumn2">
			<xp:viewColumnHeader value="No." id="viewColumnHeader2"></xp:viewColumnHeader>
		</xp:viewColumn>
		<xp:viewColumn columnName="AppDate" id="viewColumn3"
			displayAs="link">
			<xp:this.converter>
				<xp:convertDateTime type="date"></xp:convertDateTime>
			</xp:this.converter>
			<xp:viewColumnHeader value="Creation Date"
				id="viewColumnHeader3">
			</xp:viewColumnHeader>
		</xp:viewColumn>
		<xp:viewColumn columnName="$5" id="viewColumn4">
			<xp:viewColumnHeader value="Handled By"
				id="viewColumnHeader4">
			</xp:viewColumnHeader>
		</xp:viewColumn>
		<xp:viewColumn columnName="Department" id="viewColumn5">
			<xp:viewColumnHeader value="Department"
				id="viewColumnHeader5">
			</xp:viewColumnHeader>
		</xp:viewColumn>
		<xp:viewColumn columnName="Item" id="viewColumn6">
			<xp:viewColumnHeader value="Item" id="viewColumnHeader6"></xp:viewColumnHeader>
		</xp:viewColumn>
		<xp:viewColumn columnName="TotalPrice" id="viewColumn7">
			<xp:viewColumnHeader value="Total Price"
				id="viewColumnHeader7">
			</xp:viewColumnHeader>
		</xp:viewColumn>
	</xp:viewPanel>
	<xp:this.data>
		<xp:dominoView var="view1" viewName="vwPurchasing"
			expandLevel="1">
			<xp:this.categoryFilter><![CDATA[#{javascript:var c=viewScope.get("category");
if (c!="All"){
	return c;
}}]]></xp:this.categoryFilter>
		</xp:dominoView>
	</xp:this.data>
最后,还可以在下拉框选项中添加一个“全部分类”选项,在选项更换事件中,如果用户选择的是它,则不保存到requestScope里,这样视图就会显示所有的类别。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐