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

来源:互联网 发布:node.js microservice 编辑:程序博客网 时间:2024/05/29 18:38

分类视图是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里,这样视图就会显示所有的类别。