使用重复控件显示由搜索查询创建的多个范围变量

时间:2016-06-02 15:19:26

标签: javascript xpages

我有一个按钮,可以搜索数据库中的字段,并将字段的结果放在viewScope变量中。 然后我使用重复控件来显示变量。根据我能够辨别的情况,我将重复控件的数据源设置为viewscope变量,并使用计算字段通过获取重复控件的值来使用" rowIndex"来访问变量。属性,因为返回值是多个值 我的问题是: 我可以使用此方法在记录中显示多个字段吗?如果是这样,怎么样? 这是我的代码:

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" xmlns:xe="http://www.ibm.com/xsp/coreex">
    <xp:button id="button1" value="Create a Search">
        <xp:eventHandler event="onclick" submit="true"
            refreshMode="complete">
            <xp:this.action><![CDATA[#{javascript:searchFormula = '@Begins(Stu_LastName; "Se")';
var dc:NotesDocumentCollection = database.search(searchFormula);

var docItems = [];
viewScope.Firstname = [];

var i = 0;
var doc = dc.getFirstDocument();
var tmpDoc:NotesDocument;
while (doc != null) {
    docItems = doc.getItems();
    if (doc.hasItem("stu_status")) {
        var status = [];
        status = doc.getItemValue("stu_status");
        if (status[0] == "1")
            if (doc.hasItem("Stu_Firstname")) {
                item = doc.getItemValue("Stu_Firstname");
                viewScope.Firstname.push(item);
                i++
        }
        tmpDoc = dc.getNextDocument(doc);
        doc.recycle();
        doc = tmpDoc;
        if (i > 50000) {
            print("possible loop - breaking now");
            break;
        }
    }
}
var text = "The length of Firstname is " + viewScope.Firstname.length;
print(text);}]]></xp:this.action>
        </xp:eventHandler>
    </xp:button>
    <xp:br></xp:br>
    <xp:pager layout="Previous Group Next" partialRefresh="true"
        id="pager1" for="repeat1">
    </xp:pager>
    <xp:repeat id="repeat1" rows="30" value="#{viewScope.Firstname}"
        var="rowData" indexVar="rowIndex">
        <xp:text escape="true" id="computedField1">
            <xp:this.value><![CDATA[#{javascript:getComponent("repeat1").getValue()[rowIndex]}]]></xp:this.value>
        </xp:text>
        <xp:br></xp:br>
    </xp:repeat>
</xp:view>

3 个答案:

答案 0 :(得分:1)

你太难了!只需在计算文本字段中使用rowData即可。这是repeat(您的viewScope变量)中引用值中每个项的值。索引是数字索引,从零开始。

<xp:text escape="true" id="computedField1" value="#{rowData}">

    </xp:text>

答案 1 :(得分:0)

我认为你的意思是你想要获得更多的数据而不仅仅是FirstName来尝试建立一个数据表?例如FirstName,LastName,电子邮件等。

如果是这样,您最好构建搜索以返回NotesDocumentCollection中的数据,而不是获取集合并将数据提取到viewScope数组中。例如searchFormula = '@Begins(Stu_LastName; "Se") & @Contains(Stu_Status; "1")';

每个rowData条目都是一个文档。然后,您可以将字段称为#{rowData.FirstName}' or#{rowData.LastName}&#39;在重复中的计算字段中。

答案 2 :(得分:0)

决定提交一个例子以防任何人需要一个例子。从网站下载数据并创建一个包含3个字段的数据库:State AirportName AirportCode。搜索搜索状态并返回其余信息。添加代码作为答案,因为注释不允许代码所需的字符数。

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">

<xp:panel style="margin-left:10.0px;background-color:rgb(204,230,255);padding-top:20.0px;padding-bottom:5.0px" id="Search3Panel">



        <xp:table>
            <xp:tr>
                <xp:td colspan="2">



                <xp:label value="This Panel Shows a Repeat Control Using a notesDataCollection as a datasource." id="label5" style="font-weight:bold"></xp:label></xp:td>

            </xp:tr>
            <xp:tr>
                <xp:td>
                    <xp:label id="label1" value="State"></xp:label></xp:td>
                <xp:td>
                    <xp:inputText id="searchTerm"></xp:inputText></xp:td>
            </xp:tr>
            <xp:tr>
                <xp:td></xp:td>
                <xp:td>
                    <xp:button id="button1" value="Search">
                        <xp:eventHandler event="onclick" submit="true" refreshMode="complete" id="eventHandler1">
                            <xp:this.action><![CDATA[#{javascript:var searchTerm:com.ibm.xsp.component.xp.XspInputText = getComponent("searchTerm").getValue();
viewScope.State = searchTerm;
viewScope.searchFormula = '@Begins(State; "'+ searchTerm + '")' 
sessionScope.panelSee = false;}]]></xp:this.action>

                            <xp:this.script>
                                <xp:executeClientScript>
                                    <xp:this.script><![CDATA[var ret = true;
for(var i=0; i<document.forms[0].elements.length; i++){ 
    if(document.forms[0].elements[i].name == "#{id:searchTerm}" ){ 
        var choice = document.forms[0].elements[i].value;
        if (!choice) {
            alert("Please enter letters at the beginning of the state you want to search for.");
            return false
        }
    }
}]]></xp:this.script>
                                </xp:executeClientScript>
                            </xp:this.script>
                        </xp:eventHandler>
                    </xp:button>
                    <xp:button id="button4" value="Clear">
                        <xp:eventHandler event="onclick" submit="true" refreshMode="complete" id="eventHandler2">
                            <xp:this.action><![CDATA[#{javascript:viewScope.State = "";
viewScope.searchFormula = "";
sessionScope.panelSee = true;}]]></xp:this.action>
                        </xp:eventHandler>
                    </xp:button>
                </xp:td>
            </xp:tr>
        </xp:table>
    </xp:panel><xp:panel style="margin-left:10.0px;background-color:rgb(204,230,255);padding-top:10.0px;padding-bottom:10.0px" id="Repeat3Panel">
        <xp:label id="label4" value="You are searching for States that begin with " style="font-weight:bold"><xp:this.rendered><![CDATA[#{javascript:if (!!viewScope.State) {
    return true;
} else { 
    return false;
}}]]></xp:this.rendered></xp:label><xp:text escape="true" id="computedField8" value="#{viewScope.State}" style="font-weight:bold"></xp:text>
        <xp:br></xp:br>
        <xp:repeat id="repeat3" rows="30" var="APCodes">
            <xp:this.value><![CDATA[#{javascript:var dc:NotesDocumentCollection = database.search(viewScope.searchFormula);
return dc}]]></xp:this.value>
            <xp:text escape="true" id="computedField5" value="#{APCodes.State}">
            </xp:text>
            &#160;&#160;
            <xp:text escape="true" id="computedField6" value="#{APCodes.Airport}">
            </xp:text>
            &#160;&#160;
            <xp:text escape="true" id="computedField7" value="#{APCodes.Code}">
            </xp:text><xp:br></xp:br></xp:repeat>
        </xp:panel></xp:view>