我想刷新客户端Javascript触发的重复控件。为了使它有趣,我的数据源是一个JDBC查询,这就是为什么我不只是做部分刷新。 我已经看过有关使用XHR请求执行此操作的页面,但我没有看到如何刷新JDBC数据以捕获新信息。 我可以使用旧数据刷新重复控件,而不是新数据。
我看到Repeat control refresh error 其中讨论可能需要超时,因为运行时不知道新数据。 我在手动更改数据库中的某些内容并等待一分钟之后运行XHR,仍然有过时的信息。
我可以在RPC调用中更新变量(jdbcPendingSummary),如果不能,我可以回调服务器来触发CSJS函数内的刷新吗?
<xp:this.data>
<xe:jdbcQuery connectionName="testDB"
sqlQuery="EXEC ptoGetPendingRequests #{sessionScope.userID}"
var="jdbcPendingSummary" />
</xp:this.data>
<xe:jsonRpcService id="ptoRPC" serviceName="ptoRPC">
<xe:this.methods>
<xe:remoteMethod name="createNewRequest">
<xe:this.script><![CDATA[
javaBeanObject.ptoCreateRequest(#{sessionScope.userID}, startDate, endDate, comment, d1,....,d15);
// Can I update the datasource var here?
]]></xe:this.script>
<xe:this.arguments>
<xe:remoteMethodArg name="startDate" type="string"></xe:remoteMethodArg>
..........
<xe:remoteMethodArg name="d15" type="number"></xe:remoteMethodArg>
</xe:this.arguments>
</xe:remoteMethod>
</xe:this.methods>
</xe:jsonRpcService>
<xp:scriptBlock id="scriptBlock1">
<xp:this.value><![CDATA[
function createNewRequest(startDateID, endDateID, commentID, hiddenDivID, requestID) {
ptoRPC.createNewRequest(dojo.byId(startDateID).value, dojo.byId(endDateID).value, ........).addCallback( function(response) {
// ????? Refreshes the Repeat Control, but has the stale data.
setTimeout(
function() {
XSP.partialRefreshGet(requestID, {onComplete: function(responseData) { } })
// Or how about updating the datasource var here?
}, 8000);
});
}
]]></xp:this.value>
</xp:scriptBlock>
答案 0 :(得分:1)
虽然这可能不是一个完美的解决方案,但添加范围=&#34;请求&#34;下面的JDBC代码导致在AJAX调用完成时刷新变量。
<xp:this.data>
<xe:jdbcQuery connectionName="testDB"
sqlQuery="EXEC ptoGetPendingRequests #{sessionScope.userID}"
var="jdbcPendingSummary" scope="request" />
</xp:this.data>
答案 1 :(得分:1)
您可以使用特定数据源的refresh()方法实现此目的。因此,如果您有一个配置了一些JDBC Query数据源的面板 - 那么在内部视图面板中,您可以通过这样的语法引用和刷新数据:
getComponent( 'some_panel_id_containing_your_datasource')的getData()得到(0).REFRESH();
虽然您可以为面板配置多个数据源 - 但引用它们的方法是从0索引开始。
代码片段,用于演示技术可能是这样的(如果查询使用某些计算参数在刷新时显示不同的数据,则可能更有意义):
<xp:panel id="outerContainer">
<xp:this.data>
<xe:jdbcQuery var="jdbcQuery1"
connectionName="derby1">
<xe:this.sqlQuery><![CDATA[#{javascript:"select * from users";
}]]></xe:this.sqlQuery>
</xe:jdbcQuery>
</xp:this.data>
<xp:viewPanel rows="10" id="viewPanel1"
value="#{jdbcQuery1}" indexVar="idx">
<xp:viewColumn id="viewColumn1" columnName="id"
displayAs="link">
<xp:this.facets>
<xp:viewColumnHeader xp:key="header"
id="viewColumnHeader1" value="ID">
</xp:viewColumnHeader>
</xp:this.facets>
<xp:eventHandler event="onclick"
submit="true" refreshMode="partial" refreshId="outerContainer">
<xp:this.action><![CDATA[#{javascript:
getComponent('outerContainer').getData().get(0).refresh();
}]]>
</xp:this.action>
</xp:eventHandler>
</xp:viewColumn>
</xp:viewPanel>
</xp:panel>