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