2011-04-13 1 views
0

데이터 저장소 응답을 죽이는 주요 이벤트 :도장 콤보 [Enter]를 다음과 같이 내가 도장의 콤보를 구성

this.autoComplete = new dijit.form.ComboBox({ 
    id : this.name + "_term", 
    name : "search_id", 
    store : this.dataStore, 
    searchAttr : "term", 
    pageSize : "30", 
    searchDelay:500, 
    value : this.config.inputText, 
    hasDownArrow : false 
}, this.name + "_term"); 

여기서 문제는 사용자가 검색어와 히트 들어갈 때 500ms로 이전 [입력]이다 , 서비스 요청은 취소됩니다 (검색 용어를 복사하여 붙여 넣을 때 공통적입니다). 예상 한 것은 요청이 완료되고 드롭 다운에 옵션이 표시 될 때까지 단순히 [Enter] 이벤트를 무시하는 것입니다. 그런 다음 사용자는 enter 키를 다시 눌러 응답의 첫 번째 항목을 제출할 수 있습니다.

이 시나리오를 처리하는 방법에 대한 제안 사항이 있으시면 dijit.form.ComboBox에 대한 API를 살펴 봤지만이 문제를 해결할만한 매력적인 요소는 없었습니다. ComboBox 대신 FilteringSelect를 사용하면 똑같은 동작이 발생합니다. 흥미로운 점은 FilteringSelect가이 시나리오를 "invalidMessage"매개 변수에 의해 처리되는 오류로 처리한다는 것입니다. 이 오류를 오류로 처리하면 이점을 이해할 수 없습니다.

+0

내 대답보기 –

답변

1

저는 (일시적으로) monkey가 _onKeyPress 함수를 재정 의하여 dijit.form.ComboBox에 패치를 적용하여 문제를 해결했습니다. 나는 dojo v1.5를 사용 중이며 v1.6이 _onKeyPress를 _onKey로 변경했음을 확인했습니다. 따라서 업그레이드하면 분명히 문제가 해결됩니다.

나는 [입력] 이벤트를 업데이트했습니다과 같이 처리 :

case dk.ENTER: 
    // prevent submitting form if user presses enter. Also 
    // prevent accepting the value if either Next or Previous 
    // are selected 
    if(highlighted){ 
     // only stop event on prev/next 
     if(highlighted == pw.nextButton){ 
     this._nextSearch(1); 
     dojo.stopEvent(evt); 
     break; 
     }else if(highlighted == pw.previousButton){ 
     this._nextSearch(-1); 
     dojo.stopEvent(evt); 
     break; 
     } 
    }else{ 
     if (!module.autoComplete.item) { 
     doSearch = true; 
     } 
     // Update 'value' (ex: KY) according to currently displayed text 
     this._setBlurValue(); // set value if needed 
     this._setCaretPos(this.focusNode, this.focusNode.value.length); // move cursor to end and cancel highlighting 
    } 
    // default case: 
    // prevent submit, but allow event to bubble 
    evt.preventDefault(); 
    // fall through 
    break; 

문제의 코드는 다음과 같습니다 나는 기본적으로 경우에만 검색을 할 그것을 말하고

if (!module.autoComplete.item) { 
    doSearch = true; 
} 

자동 완성 객체 인스턴스가 존재하지만 아직 항목을받지 못했습니다. 이것은 못생긴 해킹이지만 순간적으로 문제를 해결하고 있습니다. 나는 이것을 더 잘 다루는 방법에 대한 몇 가지 제안을 여전히 좋아할 것이다.

관련 문제