Xpages-使用旧值刷新文档

时间:2018-12-06 12:24:33

标签: xpages xpages-ssjs

我有一些代码,如果用户在某个字段(Q1)上选择“否”答案,它将删除与Q1相关的子问题的答案,并将其隐藏在用户界面中。

这很好,我对包含所有问题的div进行了部分刷新。但是,当我单击相同的问题并选择答案“是”时,该答案将显示所有子问题,因此用户可以再次回答,仍然具有旧值。

当我删除字段时,后端文档正确地反映了这一点,但是当我单击问题然后在UI中再次显示字段时,它们再次以其原始值出现在后端文档中。如果我在代码末尾执行context.reloadPage(),那么一切都会按预期进行,但这会破坏其他功能,并且我只希望部分刷新。有任何想法吗?谢谢

try{

    if (compositeData.onClickCode) {
        compositeData.onClickCode.invoke( facesContext, null );
    } 

    document1.save();   
    var fieldName:string = compositeData.fieldName; 

//Blank all IFM fields if user selects no IFM *CHANGE FIELDS ARRAY TO GET FROM KEYWORD*     
if (fieldName == "Q1") {
 print("Yes Q1");
    if(document1.getItemValueString(fieldName)=="No") {
     print("NO IFMS");
        var questionsIFM = ["Q1a", "Q1b", "Q1c", "Q3IFM", "Q3bIFM", "Q3cIFM", "Q3dIFM", "Q4", "Q4a" ,"Q5IFM", "Q6IFM", "Q6aIFM", "Q7IFM",
        "Q7aIFM", "Q7bIFM", "Q8", "Q8a", "Q9IFM", "Q9aIFM", "Q9bIFM", "Q10IFM", "Q11IFM"];  

        var len = questionsIFM.length;
        for (i = 0; i < len; i++) { 
            print("Field Name: " + questionsIFM[i]);
            document1.removeItem(questionsIFM[i]);
        }
            document1.save();
            //context.reloadPage();
    }
}

    var guidanceOptions:string = "";    
    if (compositeData.guidanceOptions) {
        if(@IsMember(document1.getItemValueString(fieldName), compositeData.guidanceOptions)){
            guidanceOptions = document1.getItemValueString(fieldName);
        }   
    }   

    viewScope.guidance = compositeData.fieldName+guidanceOptions;

}catch(e){
    openLogBean.addError(e,this.getParent());
}

2 个答案:

答案 0 :(得分:3)

您可以使用doc.setValue('fieldName','')

更新数据源,而无需更改后端文档

或者,您可以将数据源的范围更改为“ request ”,这会强制数据源为每个请求重新加载后端文档。

编辑:

这里有一个示例,该示例直接更新始终有效的数据源(按钮“清除”)并更新组件(按钮“更新”)。

如果单击“重新加载”按钮,则字段中对的更改将“存储”在组件中。 “更新”按钮会进行部分刷新(隐藏输入字段),因此该值将丢失。

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

    <xp:div
        id="refreshMe">
        <xp:inputText
            id="inputText1"
            value="#{document1.foo}"></xp:inputText>

        <xp:inputText
            id="inputText2"
            value="#{document1.bar}"
            rendered="#{javascript:facesContext.isAjaxPartialRefresh() == false}">
        </xp:inputText>

    </xp:div>

    <xp:button
        value="Update"
        id="buttonUpdate">
        <xp:eventHandler
            event="onclick"
            submit="true"
            refreshMode="partial"
            refreshId="refreshMe">
        </xp:eventHandler>
    </xp:button>

    <xp:button
        value="Clear"
        id="buttonClear">
        <xp:eventHandler
            event="onclick"
            submit="true"
            refreshMode="partial"
            refreshId="refreshMe">
            <xp:this.action><![CDATA[#{javascript:document1.setValue('foo', '');document1.setValue('bar', '')}]]></xp:this.action>
        </xp:eventHandler>
    </xp:button>


    <xp:button
        value="Reload"
        id="buttonReload">
        <xp:eventHandler
            event="onclick"
            submit="true"
            refreshMode="complete">
        </xp:eventHandler>
    </xp:button>

</xp:view>

答案 1 :(得分:0)

我可能迟到了这个聚会,但是我找到了一种方法来强制从后端文档重新加载。您所要做的就是通过为documentId添加或删除“ 0”前缀来稍微更改dataSource的ID。像这样:

return (viewScope.idPrefix? "0":"") + param.documentId

,当您要在部分刷新期间强制重新加载时,只需设置

viewScope.idPrefix= !viewScope.idPrefix;

别忘了将ignoreRequestParams设置为true。