我有一个重复控件,它的每一行都显示一个条目(Employees的用户名,电子邮件,FullName)。 单击用户名(第1列),将弹出一个dojo对话框,显示所有员工信息。在该对话框中,我可以单击编辑按钮并编辑员工信息。
我没有使用数据源,因为员工数据位于第3个数据库中,我不允许直接访问。所以我在编辑时使用sessionAsSigner存储数据(签名者是可以访问第3个nsf的帐户)。
因此,我将数据加载到只读编辑框而不是数据源,使用“默认值”属性加载它们。当我单击编辑时,我将它们设置为readOnly(false),然后我部分刷新面板,以便我可以编辑它们。之后,我单击一个保存按钮将它们保存回文档(始终使用sessionAsSigner)然后我将文件设置回只读,然后再次部分刷新面板。 (我必须提到我有4个字段,但只能编辑3个.4rth始终处于只读模式,因为它是员工代码,不得更改。)
一切正常,直到这里。问题是当我编辑一个员工然后单击下一个(在我的重复控件中)再次编辑时。弹出窗口再次出现,但它保留了以前的员工数据。这意味着默认值不起作用,虽然我在弹出面板上进行了部分刷新。部分刷新有效,因为员工代码字段(永久只读)显示正确的员工代码,但所有可编辑字段都包含以前的数据。
我通过完全刷新页面(location.reload())解决了这个问题,但我宁愿避免完全刷新。
所以问题是我使用的是default-value属性。似乎在部分刷新时不会重新计算,只能在完全刷新时重新计算。
有什么建议吗?
答案 0 :(得分:2)
我在这里看到了许多潜在的问题,尽管在某些方面我可能错了;你需要更精确,并给我们一些编码示例,以便我们可以看到你到目前为止所尝试的内容:
首先,您使用什么属性将数据输入编辑框并不重要:如果您的弹出窗口显示来自错误重复条目的数据,则问题很可能是您通过编辑框的方式弹出窗口的价值。
问题是:您对这些编辑框使用什么样的绑定?不知道你尝试了什么,很难给你一个提示;我可能会尝试将它们绑定到您在doc的生命周期中尽早设置的viewScope变量。我尝试使用一个命名的javascript对象数组,其中数组可以用作重复的数据源。然后你的弹出窗口可以使用repeat的索引var param来获取正确的表行,并使用对象的名称引用来获取列。
其次,在创建doc数据源时创建默认值作为对用户的建议。我从来没有尝试过这个,但我不认为部分刷新可以创建一个新的默认值。但同样,我认为这不是真正的问题。
如果我弄错了你,请尽量准确地描述你的任务等。
答案 1 :(得分:2)
如果没有看到代码,很难找出导致问题的原因,但是从我的问题出发,我认为重新设计一下会更好。这里暗示我将如何解决这个问题:
对于这个例子我使用数组作为数据源你也可以使用如果你从文件中加载sessionAsSigner的数据不是很大,但我会优先选择一个bean或一个对象数据源然后我可以绑定到我的重复控件
<xp:panel id="repeatHolder">
<xp:repeat
id="repeat1"
rows="30"
var="rowEntry"
indexVar="rowIndex">
<xp:this.value><![CDATA[#{javascript://loading data with sessionAsSigner
var person1 = {"name":"Igor","value":"value","age":"20","unid":"unid"};
var person2 = {"name":"Victor","value":"value","age":"30","unid":"unid"};
//end loading data
return [person1,person2];}]]>
</xp:this.value>
<xp:panel>
<xp:text
escape="true"
id="computedField1"
value="#{rowEntry.name}">
</xp:text>
<xp:text
escape="true"
id="computedField2"
value="#{rowEntry.value}">
</xp:text>
<xp:button
value="edit"
id="edit">
<xp:eventHandler
event="onclick"
submit="false">
<xp:this.script><![CDATA[XSP.openDialog('#{id:editDialog}');]]></xp:this.script>
</xp:eventHandler>
</xp:button>
<xe:dialog
id="editDialog"
title="edit"
preload="false">
<xp:panel>
<xp:panel>
<xp:inputText
id="inputText1"
defaultValue="#{rowEntry.name}">
</xp:inputText>
</xp:panel>
<xp:panel readonly="true">
<xp:inputText
id="inputText2"
defaultValue="#{rowEntry.value}">
</xp:inputText>
</xp:panel>
<xp:button
value="save"
id="button1">
<xp:eventHandler
event="onclick"
submit="true"
refreshMode="complete">
<xp:this.action><![CDATA[#{javascript://run save actionAsSigner for doc:unid}]]></xp:this.action>
</xp:eventHandler>
</xp:button>
</xp:panel>
<xp:eventHandler
event="onHide"
submit="true"
refreshMode="partial"
refreshId="repeatHolder">
<xe:this.action><![CDATA[#{javascript://refresh view}]]></xe:this.action>
</xp:eventHandler>
</xe:dialog>
<br></br>
</xp:panel>
</xp:repeat>
</xp:panel>
只要您将xe:dialog
与preload=false
一起使用,我也会每行使用一个Dialog,如果您只使用它来编辑3个字段,则不必担心Performance issus。