我正在使用一个视图面板,并允许用户通过"选择"中的复选框选择文档。面板。
文档来源在" view / edit"中定义。面板。
以上所有作品。
我在顶部有导航按钮,可以打开"查看/编辑"面板。如果用户将文档置于编辑模式并决定(无论出于何种原因)他们想要使用导航按钮返回"选择"然后选择一批新文档进行查看或编辑,处于编辑模式的文档是第一个要查看的文档 - 它仍处于编辑模式。
我希望有一个明显的解决方案。
这是一个代码简化代码片段,用于演示此问题。您只需要插入自己的数据源:>)
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
>
<xp:panel id="buttonpanel">
<xp:button id="button1" value="Choose Docs">
<xp:eventHandler event="onclick" submit="true"
refreshMode="partial" refreshId="wrapperpanel">
<xp:this.action><![CDATA[#{javascript:viewScope.choosepanelvis= true;
viewScope.vieweditpanelvis = false;}]]></xp:this.action>
</xp:eventHandler>
</xp:button>
</xp:panel>
<xp:panel id="wrapperpanel">
<xp:panel id="choosepanel" rendered="#{javascript:viewScope.choosepanelvis}">
<xp:label id="label1"></xp:label>
<xp:button styleClass="BlueButton" id="button6"
value="View/Edit Selected Docs">
<xp:eventHandler event="onclick" submit="true"
refreshMode="partial" refreshId="wrapperpanel">
<xp:this.action>
<xp:actionGroup>
<xp:executeScript>
<xp:this.script><![CDATA[#{javascript:viewScope.DocIdList = new Array();
var viewPanel = getComponent("viewPanel1");
var docIDList = viewPanel.getSelectedIds();
viewScope.DocIdList = docIDList;
viewScope.DocIdLength = viewScope.DocIdList.length;}]]></xp:this.script>
</xp:executeScript>
<xp:actionGroup condition="#{javascript:viewScope.DocIdList.length === 0;}">
<xp:executeScript>
<xp:this.script><![CDATA[#{javascript:var varAlert = "Please select one or more documents.";
var al = "alert('"+ varAlert +"')";
view.postScript(al);
return false;
}]]></xp:this.script>
</xp:executeScript>
</xp:actionGroup>
<xp:actionGroup>
<xp:this.condition><![CDATA[#{javascript:viewScope.DocIdList.length > 0}]]></xp:this.condition>
<xp:executeScript>
<xp:this.script><![CDATA[#{javascript:viewScope.DocIdIndex = 0
var DocId=viewScope.DocIdList[viewScope.DocIdIndex];
viewScope.DocId = DocId;
viewScope.choosepanelvis= false;
viewScope.vieweditpanelvis = true;}]]></xp:this.script>
</xp:executeScript>
</xp:actionGroup>
</xp:actionGroup>
</xp:this.action>
</xp:eventHandler>
</xp:button>
<xp:viewPanel rows="30" id="viewPanel1">
<xp:this.facets>
<xp:pager partialRefresh="true" layout="Previous Group Next"
xp:key="headerPager" id="pager1">
</xp:pager>
</xp:this.facets>
<xp:this.data>
<xp:dominoView var="view1" viewName="NISDTeacher">
</xp:dominoView>
</xp:this.data>
<xp:viewColumn columnName="CampusName" id="viewColumn1"
showCheckbox="true">
<xp:viewColumnHeader value="CampusName" id="viewColumnHeader1"
showCheckbox="true">
</xp:viewColumnHeader>
</xp:viewColumn>
<xp:viewColumn columnName="TeacherFirst" id="viewColumn2">
<xp:viewColumnHeader value="TeacherFirst" id="viewColumnHeader2">
</xp:viewColumnHeader>
</xp:viewColumn>
<xp:viewColumn columnName="TeacherLast" id="viewColumn3">
<xp:viewColumnHeader value="TeacherLast" id="viewColumnHeader3">
</xp:viewColumnHeader>
</xp:viewColumn>
</xp:viewPanel>
</xp:panel>
<xp:panel id="vieweditpanel" rendered="#{javascript:viewScope.vieweditpanelvis}">
<xp:this.data>
<xp:dominoDocument var="document1" action="openDocument"
formName="CoopInfo" documentId="#{javascript:viewScope.DocId}"
ignoreRequestParams="true">
</xp:dominoDocument>
</xp:this.data>
<xp:text escape="true" id="computedField1" value="#{document1.TeacherFirst}"></xp:text>
<xp:text escape="true" id="computedField2" value="#{document1.TeacherLast}"></xp:text>
<xp:text escape="true" id="computedField3" value="#{document1.CampusName}"></xp:text>
<xp:br></xp:br>
<xp:inputTextarea id="inputTextarea1" value="#{document1.Comments}"></xp:inputTextarea>
<xp:button id="button2" styleClass="BlueButton" value="View Next Doc">
<xp:eventHandler event="onclick" submit="true"
refreshMode="partial" id="eventHandler5" refreshId="wrapperpanel">
<xp:this.action>
<xp:actionGroup>
<xp:executeScript script="#{javascript:viewScope.DocIdIndex++;}">
</xp:executeScript>
<xp:actionGroup>
<xp:this.condition><![CDATA[#{javascript:viewScope.DocIdIndex >= viewScope.DocIdLength}]]></xp:this.condition>
<xp:executeScript>
<xp:this.script><![CDATA[#{javascript:viewScope.DocIdList = new Array();
viewScope.choosepanelvis= true;
viewScope.vieweditpanelvis = false;}]]></xp:this.script>
</xp:executeScript>
</xp:actionGroup>
<xp:actionGroup>
<xp:this.condition><![CDATA[#{javascript:viewScope.DocIdIndex < viewScope.DocIdLength}]]></xp:this.condition>
<xp:executeScript>
<xp:this.script><![CDATA[#{javascript:var DocId=viewScope.DocIdList[viewScope.DocIdIndex];
viewScope.DocId = DocId;}]]></xp:this.script>
</xp:executeScript>
</xp:actionGroup>
</xp:actionGroup>
</xp:this.action>
</xp:eventHandler>
</xp:button>
<xp:button id="button3" styleClass="BlueButton" value="Edit This Record">
<xp:this.rendered><![CDATA[#{javascript:if (document1.isEditable()) {
return false;
} else {
return true;
}}]]></xp:this.rendered>
<xp:eventHandler event="onclick" submit="true"
refreshMode="partial" id="eventHandler8" refreshId="wrapperpanel">
<xp:this.action>
<xp:actionGroup>
<xp:executeScript>
<xp:this.script><![CDATA[#{javascript:context.setDocumentMode("document1","edit");}]]></xp:this.script>
</xp:executeScript>
</xp:actionGroup>
</xp:this.action>
</xp:eventHandler>
</xp:button>
<xp:button id="button11" styleClass="BlueButton"
value="Save Doc and View Next Record">
<xp:this.rendered><![CDATA[#{javascript:if (document1.isEditable()) {
return true;
} else {
return false;
}}]]></xp:this.rendered>
<xp:eventHandler event="onclick" submit="true"
refreshMode="partial" id="eventHandler7" refreshId="wrapperpanel">
<xp:this.script><![CDATA[var choice = null;
var comment = null;
for (var i=0; i<document.forms[0].elements.length; i++) {
if (document.forms[0].elements[i].name === "#{id:RadioG2}") {
if (document.forms[0].elements[i].checked === true) {
choice = document.forms[0].elements[i].value;
}
}
}
if (choice === "0") {
for (var i=0; i<document.forms[0].elements.length; i++) {
if (document.forms[0].elements[i].name === "#{id:Comments2}") {
comment = document.forms[0].elements[i].value;
}
}
}
if (comment === "" && choice === "0") {
alert("You must enter a comment if you are not going to recommend a teacher.");
return false;
}
]]></xp:this.script>
<xp:this.action>
<xp:actionGroup>
<xp:executeScript>
<xp:this.script><![CDATA[#{javascript:var radioGroup1:com.ibm.xsp.component.xp.XspSelectOneRadio = getComponent("radioGroup1").getValue();
document1.replaceItemValue("RatingNum",radioGroup1);
var inputTextarea1:com.ibm.xsp.component.xp.XspInputTextarea = getComponent("inputTextarea1").getValue();
document1.replaceItemValue("Comments",inputTextarea1);
database.updateFTIndex(false);
viewScope.DocIdIndex++;
}]]></xp:this.script>
</xp:executeScript>
<xp:actionGroup>
<xp:this.condition><![CDATA[#{javascript:viewScope.DocIdIndex >= viewScope.DocIdLength}]]></xp:this.condition>
<xp:executeScript>
<xp:this.script><![CDATA[#{javascript:viewScope.DocIdList = new Array();
viewScope.choosepanelvis= true;
viewScope.vieweditpanelvis = false;}]]></xp:this.script>
</xp:executeScript>
</xp:actionGroup>
<xp:actionGroup>
<xp:this.condition><![CDATA[#{javascript:viewScope.DocIdIndex < viewScope.DocIdLength}]]></xp:this.condition>
<xp:executeScript>
<xp:this.script><![CDATA[#{javascript:var DocId=viewScope.DocIdList[viewScope.DocIdIndex];
viewScope.DocId = DocId;
}]]></xp:this.script>
</xp:executeScript>
</xp:actionGroup>
</xp:actionGroup>
</xp:this.action>
</xp:eventHandler>
</xp:button>
<xp:radioGroup id="radioGroup1" value="#{document1.RatingNum}">
<xp:selectItem itemLabel="Highly Recommended"
itemValue="0">
</xp:selectItem>
<xp:selectItem itemLabel="Recommended" itemValue="1"></xp:selectItem>
<xp:selectItem itemLabel="Not Recommended" itemValue="2"></xp:selectItem>
</xp:radioGroup>
</xp:panel>
</xp:panel>
</xp:view>
答案 0 :(得分:0)
context.setDocumentMode()
将设置最本地XPages dominoDocument的编辑/读取模式。因此,只能在具有要控制其编辑模式的文档的特定行中工作。只要您访问该行之外的组件,它就不再能访问该特定的dominoDocument数据源。同样,从您设置编辑模式的按钮,我认为您也可以使用document1.setEditable(true()
切换到编辑模式。但是您无法从外部影响该特定document1
数据源的编辑模式。
您可以使用此wiki article中详述的.getData().get()
来获取数据源的句柄,其中get()
方法中传递的索引是相关的行索引。但是,ViewPanel可能不起作用,因为它是一个重复控件,并且相关数据源仅在行处理并在之后从内存中转储时创建。
可能的替代方法可能是设置viewScope
变量,其中包含当前编辑的相关行文档UNID。一旦尝试编辑另一行的文档,然后替换viewScope
变量,因此它只有一行。然后在保存代码中交叉引用viewScope
变量,如果UNID不匹配则中止。这通常是我在任何类型的重复控件(重复控件,视图面板,数据视图等)中进行编辑时使用的方法。
答案 1 :(得分:0)
我继续使用我为此程序提交的简化代码。该代码定义了4个面板:
在这种情况下,文档将以编辑模式打开。
我通过将以下代码添加到按钮面板中的按钮来解决了这个问题: viewScope.DocIdList = new Array(); viewScope.DocId = null;
我的调试工作的描述如下 - 但正如我在最后所说,我仍然不确定为什么修复工作。 正如我在原帖中所描述的那样,我尝试将文档放在读取模式中的许多不同的地方,但正如保罗所解释的那样,XSP文档在我的下方发生了变化 - 可以这么说。
最后,我允许所有面板都可见,并添加了一个计算字段,该字段在被视图面板中显示currentDocument的值。这实际上让我更加困惑,因为 1.我发现从程序加载一开始就在veiweditpanel中定义了一个XSP(currentDocument)文档。它处于编辑模式。没有显示任何信息,因为它与后端文档没有关联 - 我想。 然后我使用listpanel中的viewpanel选择了一个文档,并将其显示在被视图面板中。它将处于阅读模式 2(第二个令人困惑的事情)。当我将它置于编辑模式时,currentDocument会改变。
很高兴,我按照帖子顶部描述的方式解决了问题。仍然不确定为什么它有效。