为什么这段代码会写出两个文件?

时间:2015-08-27 17:46:17

标签: xpages

拥有一个数据库,我只需要一个特定类别的文档。因此,当用户访问此Xpage时,我想测试是否已经有一个文档,如果是,那么抓住那个,如果没有,则创建并保存一个。

我在数据源中写了一些SSJS来执行此操作,但是第一次运行它时会创建两个文档。我在代码中放了一个打印,然后执行这个部分两次。为什么这样做?

<?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:this.beforePageLoad><![CDATA[#{javascript:sessionScope.selectedPage = "page001"}]]></xp:this.beforePageLoad>
    <xp:this.resources>
        <xp:script src="/xpValidationDocument.jss" clientSide="false" />
        <xp:styleSheet href="/custom.css" />
    </xp:this.resources>
    <xp:this.data>
        <xp:dominoDocument var="document1" action="editDocument">
            <xp:this.documentId><![CDATA[#{javascript:sessionScope.selectedPage = "page001";
var v:NotesView = database.getView(sessionScope.selectedPage)
var doc:NotesDocuent = v.getFirstDocument()
if (doc == null)
{doc = database.createDocument();
doc.appendItemValue("form","document");
doc.appendItemValue("key",sessionScope.selectedPage);
doc.appendItemValue("crtUsr",session.getCommonUserName());
doc.appendItemValue("crtDte",session.evaluate('@Today'))
doc.save();
print ("here");
return doc.getUniversalID();}
else
{
print ("here2");
return doc.getUniversalID()}}]]></xp:this.documentId>
        </xp:dominoDocument>
    </xp:this.data>
    <xp:panel style="width:900.00px" id="pnlForm">
        <xe:widgetContainer id="widgetContainerHeader"
            style="width:100%">

            <xp:panel id="plContainer">
                <xe:formTable id="frLocationMaster"
                    disableErrorSummary="true" disableRowError="true"
                    style="lotusForm2" styleClass="scllotusui30dojo">
                    <xp:this.facets />

                    <xe:formRow id="formRow5" labelPosition="none"
                        style="padding-bottom:10.0px">
                        <xp:table style="width:99%" border="0"
                            cellpadding="0" role="presentation" cellspacing="0"
                            id="table2">
                            <xp:tr>
                                <xp:td
                                    style="width:80.00px;min-width:120px">
                                    <xp:label id="label2" for="formRow1"
                                        value="Notes" />
                                </xp:td>
                                <xp:td style="width:px">
                                    <xp:inputRichText
                                        id="inputRichText1" value="#{document1.Body}">
                                        <xp:this.attrs>
                                            <xp:attr name="toolbar">
                                                <xp:this.value><![CDATA[
            [
                ["Format", "Font", "FontSize"],
                ["Bold", "Italic", "Underline", "Strike", "-", "TextColor", "BGColor", "-", "JustifyLeft", "JustifyCenter", "JustifyRight", "JustifyBlock", "NumberedList", "-", "BulletedList"],
                ["Indent", "Outdent"],
                ["Subscript", "Superscript"],
                ["RemoveFormat", "-", "MenuPaste", "-", "Undo", "Redo", "Find", "LotusSpellChecker", "-", "Image", "Table", "Link", "Flash", "-", "PageBreak", "HorizontalRule", "SpecialChar", "Blockquote", "Smiley", "ShowBlocks"],
                ["Maximize", "Source"]
            ]
        ]]></xp:this.value>
                                            </xp:attr>
                                        </xp:this.attrs>
                                        <xp:this.dojoAttributes>
                                            <xp:dojoAttribute
                                                name="enterMode" value="2" />
                                        </xp:this.dojoAttributes>
                                    </xp:inputRichText>
                                </xp:td>
                            </xp:tr>
                        </xp:table>
                    </xe:formRow>

                </xe:formTable>
            </xp:panel>
        </xe:widgetContainer>
    </xp:panel>
</xp:view>

2 个答案:

答案 0 :(得分:0)

在viewScope变量中创建文档det UNID或NoteID后,在代码顶部检查范围变量是否为null,如果不使用该变量。 这样做的原因是在加载页面时多次重新计算数据源。

所以代码就是这样的

sessionScope.selectedPage = "page001";
if(viewScope.thisUNID==null){
var v:NotesView = database.getView(sessionScope.selectedPage)
var doc:NotesDocuent = v.getFirstDocument()
if (doc == null)
{doc = database.createDocument();
doc.appendItemValue("form","document");
doc.appendItemValue("key",sessionScope.selectedPage);
doc.appendItemValue("crtUsr",session.getCommonUserName());
doc.appendItemValue("crtDte",session.evaluate('@Today'))
doc.save();
print ("here");
viewScope.thisUNID=doc.getUniversalID()
return viewScope.thisUNID;}
else
{
print ("here2");
viewScope.thisUNID=doc.getUniversalID()
return viewScope.thisUNID}
}else{
return viewScope.ThisUNID
}

答案 1 :(得分:0)

我在快速审核中看到了一些问题。

正如Per所说,documentId可能需要是页面加载绑定,而不是运行时 - 必须在呈现响应之前加载数据源,并且运行时绑定可能不会足够早地运行。

但更大的问题是你的documentId代码不会产生任何影响,因为你没有设置ignoreRequestParams="true"。因此,documentId将从URL参数中获取,如果没有任何内容,则每次都会创建一个新文档。