Xpages-使用旧值刷新文档

Xpages-使用旧值刷新文档,xpages,xpages-ssjs,Xpages,Xpages Ssjs,我有一些代码,如果用户在某个字段(Q1)上选择“否”答案,它会删除与Q1相关的子问题的答案,并将它们隐藏在UI中 这很好,我对包含所有问题的div进行了部分刷新。但是,当我单击同一个问题,选择回答“是”,然后显示所有子问题,以便用户可以再次回答它们时,它们仍然具有旧的属性值 当我删除字段时,后端文档会正确地反映这一点,但当我单击问题并在UI中再次显示字段时,它们会以其原始值再次出现在后端文档中。如果在代码末尾执行context.reloadPage(),一切都会按预期工作,但这会破坏其他功能,我

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

这很好,我对包含所有问题的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());
}
试试看{
if(compositeData.onClickCode){
compositeData.onClickCode.invoke(facesContext,null);
} 
document1.save();
变量fieldName:string=compositeData.fieldName;
//如果用户未选择要从关键字*获取的IFM*更改字段数组,则将所有IFM字段留空
如果(字段名=“Q1”){
打印(“是Q1”);
如果(document1.getItemValueString(fieldName)=“否”){
打印(“无IFM”);
变量问题Fm=[“Q1a”、“Q1b”、“Q1c”、“Q3IFM”、“Q3bIFM”、“Q3cIFM”、“Q3dIFM”、“Q4”、“Q4a”、“Q5IFM”、“Q6IFM”、“Q6aIFM”、“Q7IFM”,
“Q7aIFM”、“Q7bIFM”、“Q8”、“Q8a”、“Q9IFM”、“Q9IFM”、“Q9bIFM”、“Q10IFM”、“Q11IFM”];
var len=问题长度;
对于(i=0;i
您可以使用
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>

我可能会迟到,但我找到了从后端文档强制重新加载的方法。您所要做的就是稍微更改数据源的id,方法是在documentId中添加或删除“0”前缀。大概是这样的:

return (viewScope.idPrefix? "0":"") + param.documentId
当您想在部分刷新期间强制重新加载时,只需设置

viewScope.idPrefix= !viewScope.idPrefix;

别忘了将ignoreRequestParams设置为true。

谢谢-不过我已经尝试了这两个选项,但仍然存在相同的问题。上一个值在下一次部分刷新时重新出现…是否引发错误?只需在部分刷新区域中添加一个消息组件。没有错误,删除了一个错误消息控件,该控件上没有显示任何内容,我的所有代码日志都记录到openLogger中,以查找错误,但也没有显示任何内容。一切似乎都运行正常,字段被正确地清空,但下一次部分刷新会返回旧值。代码末尾的context.ReloadPage()解决了错误,但我不想完全重新加载我怀疑它仍然在使用内存中的数据源,因为部分刷新不会从后端更新xspDoc……@ChrisRichards:我用一个工作示例更新了我的答案。