2013-03-12 2 views
1

Я хотел бы обновить Repeat Control, инициированный клиентской стороной Javascript. Чтобы сделать это интересным, мой источник данных - это запрос JDBC, поэтому я не просто сделал частичное обновление. Я видел страницы об использовании запроса XHR для этого, но я не вижу, как обновлять данные JDBC для захвата новой информации. Я могу обновить элемент управления повторением со старыми данными, а не с новым.XPages - обновить данные JDBC с клиентской стороны

Я видел Repeat control refresh error , в котором говорится о возможном требовании тайм-аута, потому что время выполнения не известно о новых данных. Я запустил XHR после того, как вручную изменил что-то в БД и подождал минуту, все еще имел устаревшую информацию.

Могу ли я обновить переменную (jdbcPendingSummary) в вызове RPC, если не могу я перезвонить на сервер, чтобы вызвать обновление внутри функции 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> 

ответ

1

В то время как это не может быть идеальным решением, добавляя объем = «Запрос» к коду ниже JDBC вызвало переменная должна быть обновлена ​​после завершения вызова AJAX.

<xp:this.data> 
    <xe:jdbcQuery connectionName="testDB" 
     sqlQuery="EXEC ptoGetPendingRequests #{sessionScope.userID}" 
     var="jdbcPendingSummary" scope="request" /> 
</xp:this.data> 
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> 
+0

Я изменил свой пример, он работает в вытащить свежие данные - я не мог заставить КНР работать вместе с обновленным обновлением данных. Таким образом, получается пара дополнительных k данных , но это не ужасно. Не знаете, что произошло, но 2 пробела в конце строки не дают мне строки. ' <хр: this.script> <хр: executeClientScript сценарий =" cancelPTORequestv2 (# {summaryRow.id}); "> ' – anotherBob

+0

Не уверен, что я понимаю здесь о проблеме очереди. Это на этом сайте или внутри Designer? – andrejusc

+0

Я комментировал, что не могу отформатировать код, который я вставлял в свой комментарий (так что переполнение стека, а не дизайнер). Согласно странице справки, предполагается, что она перевернет строку, если вы сделаете 2 пробела. – anotherBob

Смежные вопросы