2014-03-01 2 views
0

이전 게시물의 추가 정보입니다. 나는 그것을 할 수있는 한 간단한 사건으로 격리 할 수 ​​있었다. 내가 작업하고있는 응용 프로그램에서 사용자가 문서를 열었을 때 변경할 수있는 applicationScope 변수의 값을 기반으로 조건부 부분 새로 고침을 수행하려고합니다. partialRefresh가 호출 될 때 partialRefresh 대상이 pageLoad 이벤트에서만 동적으로 평가되지 않는 것으로 나타나기 때문에 작동하지 않습니다. 이를 증명하기 위해 업데이트없이 True와 False 사이에서 viewScope 변수를 토글하는 작은 테스트 XPage를 만들었습니다. 그런 다음 panelTrue 또는 panelFalse를 새로 고칠 지 여부를 지정하는 partialRefresh 수식이있는 버튼입니다. 기본적으로 문서를 처음 열면 refshes되고 panelFalse가 표시됩니다. vsIsTrue가 null이고 False로 해석되기 때문입니다. vsISTrue를 True로 전환 한 다음 부분 새로 고침 단추를 클릭하면 panelFalse가 새로 고쳐진 패널이라는 것을 알 수 있습니다. 결코 패널이 아닙니다. 부분 새로 고침에 대한 수식에 주석을 추가하고 부분 새로 고침 수식을 새로 고칠 때마다 실행하고 올바른 프로세스를 반환하지만 패널을 실제로 panelTrue로 새로 고칠 수는 없습니다.조건부 부분 새로 고침

제 궁금한 점은 - 다른 방법이 있습니까? 어떻게 볼 수 없기 때문에. 나는 아래의 소스를 포함했다 - 당신이 dbBar 참조를 제거해야 할 수도 있으므로 :

<?xml version="1.0" encoding="UTF-8"?> 

    <xp:view xmlns:xp="http://www.ibm.com/xsp/core" 
     xmlns:xc="http://www.ibm.com/xsp/custom"> 
     <xc:ccDebugToolbar defaultCollapsed="false" collapseTo="left"></xc:ccDebugToolbar> 
     <xp:br></xp:br> 
     <xp:br></xp:br> 
     <xp:button id="SetViewScope" value="Toggle View Scope"> 
      <xp:eventHandler event="onclick" submit="true" refreshMode="norefresh"> 
       <xp:this.action><![CDATA[#{javascript:(viewScope.get("vsIsTrue")) ? viewScope.put("vsIsTrue",false) : viewScope.put("vsIsTrue",true)}]]></xp:this.action> 
      </xp:eventHandler> 
     </xp:button> 
     <xp:button value="Partial Refresh" id="PartialRefresh"> 
      <xp:eventHandler event="onclick" submit="true" refreshMode="partial" 
       refreshId='#{javascript:if (viewScope.get("vsIsTrue")){ 
     dBar.info("Refesh panelTrue"); 
     return "panelTrue"; 
     break; 
    }else { 
     dBar.info("Refresh panelFalse"); 
     return "panelFalse"; 
     break; 
    }}'> 
      </xp:eventHandler> 
     </xp:button> 
     <xp:panel id="panelTrue"> 
      This is panelTrue - viewScope(vsIsTrue) = 
      <xp:text escape="true" id="computedField1" value="#{viewScope.vsIsTrue}"></xp:text> 
     </xp:panel> 
     <xp:panel id="panelFalse"> 
      This is panelFalse - viewScope(vsIsTrue;) = 
      <xp:text escape="true" id="computedField2" value="#{viewScope.vsIsTrue}"></xp:text> 
     </xp:panel> 
    </xp:view> 
+0

그냥 당신이 특정 조건에서 새로 고침을 방지하고자하는 명확하거나 변경하고자 할 *는 새로 고침 :이 경우, 부분 새로 고침 버튼은 다음과 같이한다 ? 이전 질문에서 당신의 목표가 전자였던 것처럼 보였지만이 질문에 대해서는 후자를 시도하는 것처럼 보입니다. –

+0

ExtLib은 옵션입니까? 스위치 구성 요소가 도움이됩니다. –

+0

@Tim - 목표를 변경하고 싶습니다. 범위 변수가 변경 될 때 vsIsTrue = true이면 부분적 새로 고침을 수행하고 그렇지 않으면 업데이트를 수행하지 않는 것이 좋습니다. –

답변

5

가 클라이언트의 데이터를 업데이트 할 필요가 이렇게하려면 내가 디버그 도구 모음을 사용하고 있습니다. 버튼의 코드를 변경하면 문제가 해결되어야한다

<xp:button id="SetViewScope" value="Toggle View Scope"> 
    <xp:eventHandler event="onclick" submit="true" refreshMode="partial" refreshId="PartialRefresh"> 
     <xp:this.action> 
      <![CDATA[#{javascript:(viewScope.get("vsIsTrue")) ? viewScope.put("vsIsTrue",false) : viewScope.put("vsIsTrue",true)}]]> 
     </xp:this.action> 
    </xp:eventHandler> 
</xp:button> 

당신이 볼 수 있듯이, 이벤트 핸들러는가합니다 (고침이 부분 로 설정되어 PartialRefresh ID가 이제 버튼을 갱신). 보기 범위 전환을 클릭하면 CSJS DOM 요소가 최신 코드로 다시로드됩니다. 다음 번에 버튼을 클릭하고 부분 새로 고침을 트리거하면 클라이언트는 올바른 ID를 서버에 전송합니다.

편집 :

또 다른 방법은 CSJS 스크립트 블록과 같은 트릭을 할 것입니다 :

<xp:div id="refreshMe"> 
    <xp:scriptBlock id="scriptBlockRefresh"> 
     <xp:this.value> 
      <![CDATA[ 
       var idPanelTrue = '#{id:panelTrue}'; 
       var idPanelFalse = '#{id:panelFalse}'; 
       var vsIsTrue = #{javascript:viewScope.get('vsIsTrue')}; 
       XSP.allowSubmit(); 
       var id = vsIsTrue?idPanelTrue:idPanelFalse; 
       XSP.partialRefreshPost(id,{}); 
      ]]> 
     </xp:this.value> 
    </xp:scriptBlock> 
</xp:div> 

대신 요소를 상쾌, 당신은 다음 올바른를 업데이트 CSJS의 sciptblock 상쾌한된다 XPage 요소. 내용 *

<xp:button value="Partial Refresh" id="PartialRefresh"> 
    <xp:eventHandler event="onclick" submit="true" refreshMode="partial" 
     refreshId='refreshMe'> 
    </xp:eventHandler> 
</xp:button> 
+0

감사합니다. 두 번째 옵션이 마음에 들지만 작업을 수행하는 것처럼 보입니다. 도움과 공유 의향에 진심으로 감사드립니다. –

+0

매력처럼 작동합니다. 정말 고마워요! –