2014-06-18 2 views
0

select 요소를 채우기 위해 룩업을 수행하는 겉으로보기에는 간단한 자바 스크립트 조각으로 고민하고 있습니다. 변수에 현재 값을 저장하고 스크립트에서 조회를 수행하고 select에 새 목록을 채운 다음 이전에 선택한 값의 색인을 찾아 선택합니다. 함수가 완료되면 selectedindex가 다시 0으로 재설정됩니다.selectedindex가 함수 종료 후 0으로 재설정됩니다.

function findCleaningFrequency(){ 
    var url = "${cleaningFrequencyLookup}".replace('SUBME', dojo.byId('ams.member').value); 
    var listbox = dojo.byId('ams.cleaningFrequency'); 
    var selectedoption = listbox.selectedIndex; 
    var selectedtext = listbox[selectedoption].text; 
    dojo.xhrGet({ 
     url : decode(url), 
     handleAs : 'json', 
     node: dojo.byId('ams.cleaningFrequency'), 
     load : 
      function(responseObject, ioArgs){ 

      fillSelect(responseObject, ioArgs.args.node.id); 
      } 
     }); 
    for (var i = 0; i < listbox.options.length; ++i) { 
     if (listbox.options[i].text === selectedtext) listbox.options[i].selected = true; 
    } 
} 

가 완료 될 때까지 나는이에 대한 이유를 볼 수없는, 내가 디버거에서 단계별로 제대로 작동 (정확하게 반환되는 새 목록에서 올바른 옵션을 선택)를 볼 수 있습니다 (마지막에 for 루프를 통과하여 예상대로 항목을 올바르게 선택 함) 드롭 다운이 다시 0으로 재설정됩니다! 관심이 없으므로 이전 버전의 dojo (1.0.2)를 사용하고 있습니다.이 경우, 작동하기 위해 업그레이드 할 수 없습니다.

답변

0

특정 사이트를 볼 수 없어도 문제가 무엇인지 확실하게 알기가 어렵습니다.

그러나 우리는 xhr의 비동기 특성으로 인해 아티팩트가 표시되고 있음을 공정하게 추측 할 수 있습니다. fillSelect() 호출이/최종 루프/최종 루프를 실행 중일 가능성이 큽니다. 이것은 XHR 콜백이 XHR이 반환 할 때 즉시 실행되지 않기 때문에 실행되기 때문입니다. ,

load: function(responseObject, ioArgs){ 
    fillSelect(responseObject, ioArgs.args.node.id); 
    for (var i = 0; i < ioArgs.args.node.options.length; ++i) { 
     if (ioArgs.args.node.options[i].text === selectedtext) ioArgs.args.node.options[i].selected = true; 
    } 
} 

별도로을이 콜백에 직접 목록 상자에 액세스하려면 자바 스크립트 클로저를 사용하는 것을 고려하고 가독성을 증가 :

가능성, 간단한 수정과 같이 콜백에 selectedtext 루프를 이동하는 것입니다

load: function(responseObject){ 
    fillSelect(responseObject, listbox.id); 
    for (var i = 0; i < listbox.options.length; ++i) { 
     if (listbox.options[i].text === selectedtext) listbox.options[i].selected = true; 
    } 
} 
+0

좋은 물건 닉! 도움을 주셔서 감사합니다. 콜백으로 루프를 이동하면 완벽하게 작동합니다. – user3589090

관련 문제