2012-04-09 2 views
3

8.5.3 UP1 사용. 나는 "숨기기/숨기기"또는 더 정확하게 xpages "show/ifs"에 사용하고있는 SSJS 스크립트 라이브러리에 문제가 있습니다. 어쨌든 전역 변수는 스크립트 라이브러리를 마지막으로 저장 한 시간의 가치를 갖는 것처럼 보입니다. 그들은 문서 현재 값을 기반으로 계산하는 것 같지 않습니다. 이것은 알려진 것입니까 (분명히 저에게 알려지지 않았습니다.).SSJS 스크립트 라이브러리의 전역 변수가 예상대로 작동하지 않습니다.

예 XPage :

<xp:this.resources> 
    <xp:script src="/ssjsVisTest.jss" clientSide="false"></xp:script> 
</xp:this.resources> 
<xp:inputText id="inputText1" value="#{document1.StatusTX}"></xp:inputText> 
<xp:br></xp:br> 
<xp:br></xp:br> 
<xp:br></xp:br> 
<xp:button value="Save" id="SaveBtn"> 
    <xp:eventHandler event="onclick" submit="true" 
     refreshMode="complete"> 
     <xp:this.action> 
      <xp:saveDocument var="document1"></xp:saveDocument> 
     </xp:this.action> 
    </xp:eventHandler> 
</xp:button> 
<xp:br></xp:br> 
<xp:br></xp:br> 
<xp:label id="label1" value="Status is Draft" 
    rendered="#{javascript:statusVisibleDraft()}"> 
</xp:label> 
<xp:br></xp:br> 
<xp:br></xp:br> 
<xp:label id="label2" value="Status is Pending" 
    rendered="#{javascript:statusVisiblePending()}"> 
</xp:label> 
<xp:br></xp:br> 
<xp:br></xp:br> 
</xp:view> 

샘플 SSJS 스크립트 라이브러리 :

var status = document1.getItemValueString('StatusTX'); 

function statusVisibleDraft() { 

x = (status == "Draft") ? 1 : 0; 

if(x > 0) { 
    return true; 
} else { 
    return false; 
} 
} 

function statusVisiblePending() { 

x = (status == "Pending") ? 1 : 0; 

if(x > 0) { 
    return true; 
} else { 
    return false; 
} 
} 

어떤 아이디어 다음은 샘플 페이지와 스크립트 라이브러리는 문제를 설명하는 것입니다? 감사합니다

답변

4

스크립트 라이브러리의 변수는 사실상 일시적입니다. 시스템로드에 따라 라이브러리는 호출간에 언로드 될 수 있습니다. 전역 변수에 대한 올바른 위치는 범위입니다 (이것이 만들어지는 범위입니다). 귀하의 예제에서는보기 범위가 적절할 것 같습니다. 또한 Sven은 계산에 대해 옳습니다. 또한 측면 종속성을 갖지 않는 것이 좋습니다. 다른 이름을 가진 다른 데이터 소스를 추가하면 ssjs lib를 재사용 할 수 없습니다. 예를 들어 매개 변수로 데이터 소스를 넘겨줍니다. 이러한 경우에는 필드 (두 번째 매개 변수)가 존재하고 세 번째 매개 변수의 값이 있는지 확인한 다음 설정합니다. viewScope.statusDraftVisible = true; // 또는 거짓

그런 다음 렌더링 한 = "# {자바 스크립트 : viewscope.statusDraftVisible}"응용 프로그램이 더 복잡하고 당신이이 검사를 많이있을 때

, 당신이 viewScope '백업 콩을 고려해 볼 수 있습니다 '일명 관리 빈.이것은 렌더링 = "# {beanName.statusDraftVisible}"빠른

에 렌더링 줄일 수 있습니다.

+0

불행히도 내가 작업하고있는 hide/when은 단순히 필드 x = value x보다 훨씬 복잡합니다. 예제에서 사용하고있었습니다. 그들은 일반적으로 평가할 3 가지 또는 4 가지 조건을 가지고 있습니다. viewScope 변수가 아마 길일 것이라고 생각합니다. 정보 주셔서 감사합니다. –

+0

Dan,이 경우 hideWhen 결과 및 기타 비즈니스 로직을 제공하는 백업 빈을 사용하는 것이 좋습니다. viewScope 관리 Bean을 사용하여 문서를 Bean에 저장하지 않을 때 염두에 두십시오. [FieldName]을 가져오고 [FieldName] 속성과로드 (unid), save() 함수 (unid가 새 문서로 채워지지 않은 경우) 및 setDBURL()을 사용하여 현재 데이터베이스의 기본값을 덮어 쓸 수 있습니다. – stwissel

2

상태 변수가 statusVisibleDraft() 및 statusVisiblePending() 함수를 호출 할 때마다 함수 외부에 있으므로이 값을 설정하지 않았기 때문입니다.

각 기능의 내부 상태 변수의 할당을 이동

: 라이브러리가로드되는 경우 SSJS 라이브러리의 코드 만 실행될

var statusVisibleDraft = function() { 

    var status = document1.getItemValueString('StatusTX'); 

    x = (status == "Draft") ? 1 : 0; 

    if(x > 0) { 
     return true; 
    } else { 
     return false; 
    } 
} 

var statusVisiblePending = function() { 

    var status = document1.getItemValueString('StatusTX'); 

    x = (status == "Pending") ? 1 : 0; 

    if(x > 0) { 
     return true; 
    } else { 
     return false; 
} 
} 
+0

감사합니다. 변수를 함수로 옮기면 함수가 작동하지만 전역 변수를 갖는 목적을 상실한다는 것을 알았습니다. 일반적으로 사용되는 필드에 대해 반복적으로 코드를 반복하지 않아도되도록하고 싶었습니다. 글로벌 필드를 가질 수있는 방법이 있을까요? 그렇지 않은 것입니까? –

2

. domino 서버는 라이브러리를 내부적으로 캐시합니다. SSJS 라이브러리 또는 포함 된 XPage를 저장하는 경우에만 라이브러리가 다시로드되어 다시 실행됩니다.

브라우저에서 XPage를 다시로드하면 SSJS 라이브러리가 다시로드되거나 다시 실행되지 않습니다. 브라우저를 닫고 XPage를 다시 열어도 domino는 새로 고치지 않습니다.

SSJS 라이브러리에 print 문을 몇 개 추가하면 서버 콘솔에서 동작을 볼 수 있습니다.

어쩌면 이것은 당신이 찾고있는 해답 일 것입니다. 이 글로벌 변수 상태 만 할 것을 SSJS 라이브러리가로드 처음 계산된다는 것을 의미합니다 :

희망이

편집 스벤에게 도움이됩니다.

+0

설명해 주셔서 감사합니다. 스크립트 라이브러리에 전역 변수를 갖는 다른 방법이 있습니까? 아니면 내가 그런 식으로 범위 변수를 사용하도록 되돌려 야합니까? –

관련 문제