2013-05-06 2 views
0

필드에 반복 컨트롤이 있습니다. 지금은 onChange 이벤트에서 viewScope을 사용하여 반복 컨트롤 내부에서 필드 값을 캡처합니다. 범위 변수에 설정된 값을 얻으려면 필드가 부분적으로 새로 고쳐 져야합니다.반복 컨트롤에서 값 가져 오기

여기에서 문제는 사용자가 포커스를 반복 컨트롤 밖으로 설정하면 필드의 부분 새로 고침이 완료 될 때까지 포커스가 설정되지 않는다는 것입니다. 때로는 사용자가 원격 도미노 서버에 액세스 할 때이 부분 새로 고침이 너무 느립니다. 양식을 제출할 때 반복 제어 내부의 값을 캡처하는 효과적인 방법이 있습니까?

아이디어는 추가 버튼을 클릭 할 때 동적으로 필드를 만드는 것입니다. 문제는 반복 컨트롤 내부의 필드에서 반복 컨트롤 외부의 필드로 포커스를 이동할 때 발생합니다. 반복 컨트롤 내부의 부분 새로 고침이 완료 될 때까지 포커스가 설정되지 않습니다. 서버가 시스템에서 로컬로 실행중인 경우에는이 시나리오가 수행되지 않을 수 있습니다. 아래의 코드는 반복 컨트롤의 사용은 입력 변수 번호와 반복 제어를위한 동적

<xp:button value="Add Objects" id="addNavObj"> 
    <xp:eventHandler event="onclick" submit="true" 
     refreshId="objLine" refreshMode="partial" id="eventHandler24"> 
     <xp:this.action><![CDATA[#{javascript:viewScope.rowItems=viewScope.rowItems+1;getComponent("navObjRep").setValue(parseInt(viewScope.rowItems));}]]></xp:this.action> 
    </xp:eventHandler> 
</xp:button> 
<xp:repeat rows="30" var="rowData" indexVar="rowIndex" 
    repeatControls="false" first="0" value="#{javascript:viewScope.rowItems}" 
    id="navObjRep" style="width:800.0px"> 
    <xp:panel style="width:800.0px" id="objLine"> 
     <xp:table style="width:800.0px"> 
      <xp:tr> 
       <xp:td style="width:245.0px"> 
        <xp:inputText id="objType" style="width:130.0px"> 
         <xp:typeAhead mode="full" minChars="1" ignoreCase="true" 
          id="typeAhead4" rendered="false"> 
         </xp:typeAhead> 
        </xp:inputText> 
       </xp:td> 
       <xp:td style="width:46.0px"> 
        <xp:inputText id="objCode"> 
         <xp:eventHandler event="onchange" submit="true" 
          refreshMode="partial" refreshId="objCode" id="eventHandler3"> 
          <xp:this.action><![CDATA[#{javascript:viewScope['objCode'+rowIndex] = getComponent("objCode").getValue()}]]></xp:this.action> 
         </xp:eventHandler> 
        </xp:inputText> 
       </xp:td> 
       <xp:td style="width:300.0px"> 
        <xp:inputTextarea id="objDesc" style="height:40.0px;width:200.0px"> 
         <xp:eventHandler event="onclick" submit="false" id="eventHandler40"></xp:eventHandler> 
         <xp:eventHandler event="onchange" submit="true" 
          refreshMode="partial" refreshId="objDesc" id="eventHandler4"> 
          <xp:this.action><![CDATA[#{javascript:viewScope['objDesc'+rowIndex] = getComponent("objDesc").getValue()}]]></xp:this.action> 
         </xp:eventHandler> 
        </xp:inputTextarea> 
       </xp:td> 
      </xp:tr> 
     </xp:table> 
    </xp:panel> 
</xp:repeat> 
+0

한 걸음 뒤로 물러나 야합니다. 달성하려는 기능은 무엇입니까? 결국 솔루션은 귀하의 접근 방식과 완전히 다릅니다. 그래서 좀 더 공유하십시오! – stwissel

+0

버튼을 클릭하면 전체 반복 컨트롤이 새로 고침되고 inputTextArea에 대한 onChange 핸들러에서도 수행됩니다 (왜 OnChange가 자주 발생하며 확인란/라디오/드롭 다운이없는 경우). 그것은 roundtripping에 많은 문제를 만든다.) 응답은 약간의 시간 (네트워크, CPU)을 필요로하기 때문에 데이터가 다시 돌아 오면 클라이언트의 포커스가 엉망이됩니다. - 달성하려는 사용자 환경은 무엇입니까? 나는 아직도 그 부분을 놓치고있다. – stwissel

+0

위의 태그에서 객체 추가 버튼을 클릭 할 때마다 반복 제어가 새로 고쳐지면서 필드가 동적으로 생성 된 새 테이블 행이 추가됩니다. 부분 새로 고침이있는 onChange 이벤트는 필드 안의 값을 캡처하고 viewScope에 설정하기 위해 내부의 모든 필드에 대해 설정됩니다. 사용자가 구매 주문에 대한 새로운 광고 항목을 추가하거나 완료 한 각 작업에 대한 작업 표를 추가하려는 경우이 논리가 도움이됩니다. 그 날 – shibu

답변

0

부분적 새로 고침을 위해 편집 상자의 onChange 이벤트를 사용하지 마십시오. 야간 숙달을 생성합니다. Excercise 23 만 있으면됩니다.

0

그것의 단순한 예 필드를 만드는 방법을 보여줍니다 그것은 당신이 당신의 문제를 해결하는 데 도움이 Fields.Hope을 계산.

<xp:this.beforePageLoad><![CDATA[#{javascript:var languages:java.util.Vector = @Explode("de,en,pl",","); 
       viewScope.put("allLanguages",languages); 
       viewScope.put("selectedLanguages", languages)}]]> 
    </xp:this.beforePageLoad> 

<xp:checkBoxGroup id="checkBoxGroup1" value="#{viewScope.selectedLanguages}"> 
    <xp:this.defaultValue><![CDATA[#{javascript:return viewScope.get("allLanguages");}]]></xp:this.defaultValue> 
    <xp:eventHandler event="onchange" submit="true" refreshMode="complete"> 
     <xp:this.action><![CDATA[#{javascript:// full update //partial update}]]></xp:this.action> 
    </xp:eventHandler> 
    <xp:selectItems> 
     <xp:this.value><![CDATA[#{javascript:return viewScope.get("allLanguages");}]]></xp:this.value> 
    </xp:selectItems> 
</xp:checkBoxGroup> 

<xp:repeat id="repeat1" rows="30" var="varcollection" repeatControls="true"> 
      <xp:this.value><![CDATA[#{javascript:return viewScope.get("allLanguages");}]]></xp:this.value> 

    <xp:span> 
     <xp:this.rendered><![CDATA[#{javascript:var vec:java.util.Vector = viewScope.get("selectedLanguages"); 
    return @IsMember(varcollection,vec); 
    }]]></xp:this.rendered> 

       <xp:label id="label1"> 
        <xp:this.value><![CDATA[#{javascript:return varcollection + ": ";}]]></xp:this.value> 
       </xp:label> 

       <xp:inputText id="inputText1" loaded="true"> 
        <xp:this.value><![CDATA[${javascript:var fieldName = "Help_" + varcollection; 
    return '#{viewScope.' + fieldName + '}';}]]></xp:this.value> 

        <xp:eventHandler event="onchange" submit="true" 
         refreshMode="partial" refreshId="computedField1"> 
        </xp:eventHandler></xp:inputText> 
       &#160;&#160;<xp:text escape="true" id="computedField4"><xp:this.value><![CDATA[#{javascript:var fieldName = "Help_" + varcollection; 
    return '#{viewScope.' + fieldName + '}';}]]></xp:this.value></xp:text>&#160;&#160; 
       <xp:text escape="true" id="computedField1"> 
        <xp:this.value><![CDATA[${javascript:var fieldName = "Help_" + varcollection; 
    return '#{viewScope.' + fieldName + '}'; 
    }]]></xp:this.value> 
       </xp:text> 

       <xp:br></xp:br> 

      </xp:span> 

     </xp:repeat> <xp:br></xp:br> 
       <xp:button value="Submit" id="button1"> 
       <xp:eventHandler event="onclick" submit="true" refreshMode="complete" immediate="false" save="true"></xp:eventHandler></xp:button> 
       <xp:br></xp:br> 
       <xp:br></xp:br> 
       <xp:text escape="true" id="computedField3"><xp:this.value><![CDATA[#{javascript:return "value1 = " +viewScope["Help_de"] + 
        "value2 = " +viewScope["Help_en"] + 
        "value3 = " +viewScope["Help_pl"]}]]></xp:this.value></xp:text> 

마지막 computet 필드

: computetdField3는 값 'onSubmit'와 다른 onChange을 얻을 것이다.

+0

답장을 보내 주셔서 감사합니다. 뷰 범위 변수의 사용법에 대한 새로운 아이디어를 얻었습니다. 위 예제는 반복 컨트롤이 true로 설정된 경우 작동합니다. 컨트롤이 false로 설정되면 실패합니다. 여기에 추가 버튼을 사용하여 필드를 동적으로 추가하려고합니다. 그리고 값을 제출하는 동안 반복 컨트롤 내부에서 생성 된 필드에서 검색해야합니다. – shibu

+0

반복 컨트롤을 끄면 다른 인덱스를 바인딩 할 때 컨트롤 ('label2','inputText2'와'comptutedField5/2')은 다른 데이터 소스'(ScopeVariables)'를 생성합니다. 나는 stwissel maby와 당신의 문제에 대한 완전히 다른 해결책이 필요하다는 것에 동의합니다. 그래서 maby는 우리에게 좀 더 많은 문맥을줍니다. –

0

거의 동일한 문제로 몇 시간 동안 스트레스를받습니다. 서로 다른보기에서 반복 빌드를 만들었으며 행에 3 개의 필드로 이루어진 좋은 입력 행렬을 표시하기 위해 결과를 일부 통합했습니다. 반복 할 필드가있는 모든 줄마다 새 문서를 만들고 싶습니다.

부분적 리프레쉬는 실제로 악몽입니다.

마지막으로 클라이언트 측 스크립트 onfocusonChange 이벤트가 페이지의 숨겨진 필드에 추가되었습니다. 행당 3 개의 필드를 연결하여 §으로 구분 된 숨겨진 필드에 넣습니다.
제출 버튼을 누르면 서버 측에 숨겨진 필드 값인 @Explode("§")이 표시되고 새롭게 생성 된 배열을 실행하여 문서를 만듭니다.

관련 문제