2010-06-07 6 views
0

나는 다음과 같은 콤보를 사용하고 있습니다 : 3 개 문자에 입력 한 사용자가 서버에 쿼리가 올바른 결과를 보여주는 만든 그래서 Extjs combobox - doQuery 콜백?

  var cb = new Ext.form.ComboBox({ 
      store: someDs,    
      fieldLabel: 'test', 
      valueField:'name', 
      displayField:'name_id', 
      typeAhead: true, 
      minChars: 3, 
      triggerAction: 'query' 
     }); 

.

는 지금은 사용자 입력이 프로그램 콤보 상자의 doQuery() 함수를 USINT 만들려고. doQuery() 메서드를 호출 한 후 setValue()를 통해 Item을 seled하는 것이 좋습니다.

 cb.doQuery('myval'); 
     cb.setValue('myval'); 

문제가 호출 될 때, 요청이 doQuery을 시작했기 때문에의 setValue()가 완료되지 않았()를 PROPPER 값을 선택 할 수 없다는 것입니다. 그래서 setValue()를 사용할 수있는 콜백과 같은 것이 필요하지만 doQuery()는 콜백 함수가없는 것 같습니다.

어떤 아이디어가 있습니까? 감사!

+0

흠, 어쩌면 '로드'를 사용하는 옵션입니다 콤보 박스에 할당 된 상점의 예 : someDs.store.on ('load', function() { cb.setValue ('myval'); }); cb.doQuery ('myval'); 하지만이 우아한 솔루션의 경우 잘 모르겠어요 ... – Ben

+0

이 내가 생각했던 옵션들 중 하나입니다. 당신이 원하는대로 작동합니까? –

답변

1

내가 코멘트에서 avaiable이다없는 코드 형식 IST bacause 자신에 대답하고있다.

이고르 : 작동하지만 다음 추한 해킹 깨끗한 솔루션 것 같은 느낌이 든다. 더 나은 이해를 위해서 나는 상황을 설명한다 : 나는 GridPanel을 가지고있다. 사용자가이 패널에서 행을 클릭하면 콤보 상자에서 선택한 값을 미리 선택하려고합니다. 콤보 상자의 doQuery 함수를 사용하여 데이터를 낮추고 자하는 많은 데이터가 있기 때문에.

var myrec = Ext.getCmp('mygrid').store.getAt(rowIndex); 

mycombo.store.on('load', myfn1 = function() { 
    // When the store has finisihed loading, select item in the combobox 
    mycombo.setValue(myrec.data.customer_id); 
    // Remove the function assigend to the load event... 
    // ...(when user types directly to the combobox instead clicking on a row...) 
    mycombo.store.un('load', myfn1); 
}); 
// setValue has to be called again, because the load-event doesn't fires 
// when doQuery is called with same params 
mycombo.setValue(myrec.data.customer_id); 
// Call do query to fill the combo only with the relevant values 
mycombo.doQuery(myrec.data.customer_id); 
0

ComboBox 당신에게 쿼리를 차단하는 대신 자신의 저장소 하중을하고 ComboBox 쿼리를 취소 할 수있는 옵션을 제공하는 beforequery 이벤트를 가지고 다음 GridPanel의 rowClick 이벤트에서 나는 다음과 같은 코드가 있습니다. 또한 예제에서 핸들러 함수를 변수에 저장 한 후 핸들러 내에서 un을 호출합니다. 즉, (세 번째 매개 변수 scope입니다) on에 네 번째 매개 변수로 옵션을 {single: true} 통과 할 수있는, 완전히 불필요합니다. 나는 당신의 질문을 이해하면

, 당신은 고객 ID 123 말, 특정 값으로 콤보의 값을 설정합니다. 문제는 고객 123에 대한 레코드가로드되어 있지 않아 해당 고객에 관한 상점의 데이터가없는 것입니다. 내가 맞습니까?

는 (이, 당신은 시작하는 단지 방향으로 상황에 반드시 정확하지 않습니다)를 할 수있다 할 것입니다 무엇 :

combo.on('beforequery', function(q) { 
    q.cancel = true; 
    var id = q.query; 
    combo.setDisabled(true); 
    combo.store.on('load', function() { 
    combo.setValue(id); 
    }, combo.store, {single: true}); 
    combo.store.reload({ 
    customer_id: id 
    }); 

    return q; 
});