更新 NotesDocument 不会更新绑定的 NotesXspDocument
Updating NotesDocument does not update bound NotesXspDocument
我正在尝试了解 XPage 上的数据源与其对应的 NotesDocument 之间的关系。
我有两个数据源 doc1
和 doc2
绑定到一个 XPage,其中各种字段绑定到第一个或第二个文档。 doc1
由用户填写,但我使用带有预输入功能的文本框来搜索要绑定到 doc2
的文档。当用户单击 typeahead 的结果之一时,我尝试将找到的文档附加到 doc2
但它不起作用。有人可以解释我做错了什么吗?
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
<xp:this.data>
<xp:dominoDocument var="doc1" formName="form1"
documentId="#{sessionScope.clientUNID}" databaseName="${sessionScope.ClientsDbPath}"
action="#{viewScope.DocEditMode}" ignoreRequestParams="true" />
<xp:dominoDocument var="doc2" formName="form2"
documentId="#{viewScope.providerUNID}" databaseName="${sessionScope.ProvidersDbPath}"
action="#{viewScope.DocEditMode}" ignoreRequestParams="true" />
</xp:this.data>
<xp:inputText id="providerFullName" value="#{doc1.providerFullName}">
<xp:this.attrs>
<xp:attr name="placeholder" value="Last name..." />
</xp:this.attrs>
<xp:typeAhead mode="partial" minChars="1" ignoreCase="true"
valueList="#{javascript:@DbColumn(sessionScope.ProvidersDbPath, 'providerLookup', 1)}" />
<xp:eventHandler event="onchange" submit="true"
refreshMode="partial" refreshId="panel1"
disableValidators="true">
<xp:this.action><![CDATA[#{javascript:
var pDB:NotesDatabase = session.getDatabase(sessionScope.ServerName, sessionScope.ProvidersDbPath);
var pView:NotesView = pDB.getView('providerLookup');
var result = getComponent('providerFullName').getValue();
var tmpDoc:NotesDocument = pView.getDocumentByKey(result, true);
if (tmpDoc != null) {
//here I am trying to associate the found doc with the data source
var prDoc:NotesDocument = doc2.getDocument();
prDoc = tmpDoc;
//the back-end assignment works because this DOES return the last name
print('prDoc lastname: ' + prDoc.getItemValueString('lastName'));
//then I try to update the Xsp doc from the changed back-end doc but it returns nothing
doc2.getDocument(true);
print('doc2 lastname: ' + doc2.getItemValueString('lastName'));
}}]]></xp:this.action>
</xp:eventHandler>
</xp:inputText>
</xp:view>
数据源关系是单向的吗?也就是说,如果以编程方式更新了 NotesDocument,我能否仅将数据从 XspDocument 推送到 NotesDocument(通过输入文本字段)但不能将数据从 NotesDocument 推送回 XspDocument?
此外,我不确定 doc2
上是否需要 action
参数。我认为只有当它是页面上唯一的数据源时才需要该参数...?
if (tmpDoc != null) {
//here I am trying to associate the found doc with the data source
var prDoc:NotesDocument = doc2.getDocument();
在这里你扔掉 doc2.getDocument...
的结果
prDoc = tmpDoc;
//the back-end assignment works because this DOES return the last name
print('prDoc lastname: ' + prDoc.getItemValueString('lastName'));
//then I try to update the Xsp doc from the changed back-end doc but it returns nothing
doc2.getDocument(true);
viewScope.providerUNID 是否包含有效的 noteID?如果不是,doc2是一个临时的DominoDocument,没有后端Document。
print('doc2 lastname: ' + doc2.getItemValueString('lastName'));
因此无法从中检索到任何内容。
数据源在前,文档在后。
如果要将找到的文档附加到 doc2,则必须将 viewScope.providerUNID 设置为其 noteID 并部分刷新引用 doc2 的代码部分。例如,您可以创建一个新的 xp:panel 并将 doc2 的定义移到那里,这样当您刷新面板时,就会加载数据源。
HTH
我正在尝试了解 XPage 上的数据源与其对应的 NotesDocument 之间的关系。
我有两个数据源 doc1
和 doc2
绑定到一个 XPage,其中各种字段绑定到第一个或第二个文档。 doc1
由用户填写,但我使用带有预输入功能的文本框来搜索要绑定到 doc2
的文档。当用户单击 typeahead 的结果之一时,我尝试将找到的文档附加到 doc2
但它不起作用。有人可以解释我做错了什么吗?
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
<xp:this.data>
<xp:dominoDocument var="doc1" formName="form1"
documentId="#{sessionScope.clientUNID}" databaseName="${sessionScope.ClientsDbPath}"
action="#{viewScope.DocEditMode}" ignoreRequestParams="true" />
<xp:dominoDocument var="doc2" formName="form2"
documentId="#{viewScope.providerUNID}" databaseName="${sessionScope.ProvidersDbPath}"
action="#{viewScope.DocEditMode}" ignoreRequestParams="true" />
</xp:this.data>
<xp:inputText id="providerFullName" value="#{doc1.providerFullName}">
<xp:this.attrs>
<xp:attr name="placeholder" value="Last name..." />
</xp:this.attrs>
<xp:typeAhead mode="partial" minChars="1" ignoreCase="true"
valueList="#{javascript:@DbColumn(sessionScope.ProvidersDbPath, 'providerLookup', 1)}" />
<xp:eventHandler event="onchange" submit="true"
refreshMode="partial" refreshId="panel1"
disableValidators="true">
<xp:this.action><![CDATA[#{javascript:
var pDB:NotesDatabase = session.getDatabase(sessionScope.ServerName, sessionScope.ProvidersDbPath);
var pView:NotesView = pDB.getView('providerLookup');
var result = getComponent('providerFullName').getValue();
var tmpDoc:NotesDocument = pView.getDocumentByKey(result, true);
if (tmpDoc != null) {
//here I am trying to associate the found doc with the data source
var prDoc:NotesDocument = doc2.getDocument();
prDoc = tmpDoc;
//the back-end assignment works because this DOES return the last name
print('prDoc lastname: ' + prDoc.getItemValueString('lastName'));
//then I try to update the Xsp doc from the changed back-end doc but it returns nothing
doc2.getDocument(true);
print('doc2 lastname: ' + doc2.getItemValueString('lastName'));
}}]]></xp:this.action>
</xp:eventHandler>
</xp:inputText>
</xp:view>
数据源关系是单向的吗?也就是说,如果以编程方式更新了 NotesDocument,我能否仅将数据从 XspDocument 推送到 NotesDocument(通过输入文本字段)但不能将数据从 NotesDocument 推送回 XspDocument?
此外,我不确定 doc2
上是否需要 action
参数。我认为只有当它是页面上唯一的数据源时才需要该参数...?
if (tmpDoc != null) {
//here I am trying to associate the found doc with the data source
var prDoc:NotesDocument = doc2.getDocument();
在这里你扔掉 doc2.getDocument...
的结果 prDoc = tmpDoc;
//the back-end assignment works because this DOES return the last name
print('prDoc lastname: ' + prDoc.getItemValueString('lastName'));
//then I try to update the Xsp doc from the changed back-end doc but it returns nothing
doc2.getDocument(true);
viewScope.providerUNID 是否包含有效的 noteID?如果不是,doc2是一个临时的DominoDocument,没有后端Document。
print('doc2 lastname: ' + doc2.getItemValueString('lastName'));
因此无法从中检索到任何内容。
数据源在前,文档在后。
如果要将找到的文档附加到 doc2,则必须将 viewScope.providerUNID 设置为其 noteID 并部分刷新引用 doc2 的代码部分。例如,您可以创建一个新的 xp:panel 并将 doc2 的定义移到那里,这样当您刷新面板时,就会加载数据源。
HTH