1

クライアント側の Javascript によってトリガーされた Repeat Control を更新したいと思います。興味深いことに、私のデータソースは JDBC クエリです。これが、部分的な更新だけを行わなかった理由です。XHR リクエストを使用してこれを行う方法についてのページを見たことがありますが、JDBC データを更新して新しい情報を取得する方法がわかりません。新しいデータではなく、古いデータで繰り返しコントロールを更新できます。

ランタイムが新しいデータを認識していないため、タイムアウトが必要になる可能性があることを示すRepeat control refresh errorを見ました。DBで何かを手動で変更して1分待った後、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>
4

2 に答える 2

1

これは完全な解決策ではないかもしれませんが、以下のJDBCコードにscope = "request"を追加すると、AJAX呼び出しが完了したときに変数が更新されました。

<xp:this.data>
   <xe:jdbcQuery connectionName="testDB"
       sqlQuery="EXEC ptoGetPendingRequests #{sessionScope.userID}"
       var="jdbcPendingSummary"  scope="request" />
</xp:this.data>
于 2013-03-18T17:55:18.950 に答える
1

特定のデータ ソースの refresh() メソッドを使用してそれを実現できます。したがって、JDBC Query データソースが構成されたパネルがある場合、内部ビュー パネル内で、次のような構文を使用してデータを参照および更新できます。

getComponent('some_panel_id_containing_your_datasource').getData().get(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>
于 2013-03-21T10:28:16.607 に答える