Xpages-使用旧值刷新文档



我有一些代码,如果用户在某个字段(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());
}

您可以使用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>

我可能会迟到,但我找到了一种方法,可以强制从后端文档重新加载。您所要做的就是通过添加或删除一个"来稍微更改dataSource的id;0";documentId的前缀。类似这样的东西:

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

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

viewScope.idPrefix= !viewScope.idPrefix;

不要忘记将ignoreRequestParams设置为true。

最新更新