2011-09-08 6 views
2

extjs 콤보 상자를 사용할 때 문제가 발생합니다 (브라우저와 상관없이 Chrome에서 테스트되고 동일한 결과로 FF로 테스트 됨).ExtJS 4 - ComboBox 문제

콤보 상자가 잘로드되어 두 항목이 모두 표시됩니다. 처음에로드 된 두 개 중 하나를 선택할 수 있지만 이미 선택한 후에 선택을 변경하면 원래 값이 유지되고 선택 또는 변경 이벤트가 발생하지 않습니다. 필자는 선택되지 않은 항목을 입력하기 시작하면 자동 완료 기능이 작동하고 return 키를 눌러 항목을 선택하고 select 이벤트와 change 이벤트가 발생하는 것으로 나타났습니다. 선택하지 않은 항목을 클릭하기 만하는 이유는 무엇입니까?

[{"iMonitorID":"85","sMonitorName":"6176 - xxx.xxx.xxx.xxx default monitor"},{"iMonitorID":"86","sMonitorName":"14177 - aaa.bbbbbbbbb.com default monitor"}] 

감사 :

//Model 
Ext.define('cbMonitorModel', { 
    extend: 'Ext.data.Model', 
    fields: [ 
     {name: 'iMonitorID', type: 'String'}, 
     {name: 'sMonitorName', type: 'String'} 
    ] 
}); 

//Reader 
var cbMonitorReader = Ext.create('Ext.data.JsonReader',{ 
    type: 'json', 
    model: 'cbMonitorModel' 
}); 

//Store 
var cbMonitorDataStore = Ext.create('Ext.data.Store',{ 
fields: ['iMonitorId','sMonitorName'], 
autoLoad: true, 
proxy: { 
    type: 'ajax', 
    url: '/inc/ajax/Monitors.php', 
    actionMethods: 'POST', 
    reader: cbMonitorReader, 
    extraParams: { 
     task: 'getMonitors', 
     domain: sMonitorDomainName 
    } 
} 
}); 

//ComboBox 
Ext.create('Ext.form.ComboBox',{ 
    fieldLabel: 'Monitor', 
    store: cbMonitorDataStore, 
    queryMode: 'local', 
    displayField: 'sMonitorName', 
    valueField: 'iMonitorId', 
    renderTo: Ext.get('monitorSelect'), 
    width: 400, 
    listeners: { 
     select: function(combo, records, opts) { 
      console.log('MonitorComboBox - Select'); 
      console.log(combo); 
      console.log(records); 
      console.log(opts); 
      console.log(cbMonitorDataStore); 
      console.log('--------------------------------------------------------------------'); 
     } 
    } 
}); 

프록시는 다음과 같은 문자열을 반환 :

다음은 모델, 리더, 데이터 저장 및 콤보 상자 코드입니다. 어떤 도움을 주시면 감사하겠습니다.


편집 : 난 아직이 문제를 생각하지 않은,하지만 그 동안, 나는 주위에 "더러운"일을 발견했습니다

2011-09-08 중부 표준시 16시 32분 ... expand 이벤트는 사용자가 다른 값을 선택할 수있는 이전 값을 지 웁니다. 그러나 문제는 "getValue()"를 사용할 수 없다는 것입니다 ... 따라서 cb.lastSelection[0].raw.iMonitorID 문자열 ...

콤보 상자 코드 :

var MonitorCB = Ext.create('Ext.form.ComboBox', { 
    fieldLabel: 'Monitor', 
    store: cbMonitorDataStore, 
    queryMode: 'local', 
    displayField: 'sMonitorName', 
    valueField: 'iMonitorName', 
    width: 400, 
    renderTo: 'monitorSelect', 
    listeners: { 
     select: function(cb, rec, opts){ 
      console.log(cb.lastSelection[0].raw.iMonitorID); 
     }, 
     expand: function(){this.clearValue()} 
    } 
}); 
+0

꽤 잘 정의 된 것 같습니다 .. 문제는 renderTo 설정으로 인해 발생할 수 있습니다 ... Api에서 지정합니다. * 구성 요소가 하위 항목이 될 경우이 옵션을 사용하지 마십시오. 컨테이너. 컨테이너의 레이아웃 매니저가 자식 아이템을 렌더링하고 관리해야 할 책임이 있습니다. * 기본적으로, 컴포넌트가 렌더링 자체를 관리하지 않는다는 것을 이해하면, 그 자체가 렌더링 객체를 관리합니다. items config를 사용하여 컨테이너에 구성 요소를 추가하고 config renderTo를 삭제하십시오. – nscrob

+0

감사합니다 nscrob, 원래는이 콤보 상자를 콤보 상자가 같은 위치에 렌더링 된 패널에 중첩 시켰습니다. 같은 문제가 발생했습니다. 나는 데이터 저장소와 관련이 있다고 생각한다. 프록시를 사용하지 않고 "필드"와 "데이터"(실제로는 아니지만 호기심이 강하다)에서 하드 코드를 사용하면 제대로 작동하기 때문이다. – SerEnder

+0

이제 내가 격자에 대한 확인란 열 모델과 동일한 문제가 있다고 생각하는데, 그 문제는 저장소가 다른 어딘가에서 사용되었다는 사실을 발견했습니다. 사실 extjs4에서는 저장소에 훨씬 더 가까이 바인딩되어 있습니다 , 레코드에 대한 수정은 그것을 사용하는 구성 요소를 렌더링하는 커밋이 필요합니다. 다른 곳의 상점을 사용하는 경우이 문제가 될 수 있습니다 ... – nscrob

답변

3

코드에 실수가 있습니다. 콤보 박스 구성에서 valueField: 'iMonitorId'은 작은 글자 d으로 지정되어 있으며 모델 구성에서는 name: 'iMonitorID'이 큰 것으로 지정되어 있습니다 (프록시는 'iMonitorID'을 반환합니다).

그건 그렇고. 모델 판독기와 상점 필드 설정을 모두 사용하고 있습니다. 저장소에 이미 잘못된 필드가 설정되어 있으므로 올바른 모델의 필드 config가 사용되지 않습니다.

그래서 해결책은 다음과 같습니다

1. 매장의 설정에 fields: ['iMonitorId','sMonitorName'], 제거.
2. 변경 valueField ~ 'iMonitorID' 콤보 박스 '구성.

+1

''... 문제가 시작된 후 값을 하드 코드 한 시점에서 나온 'fields : ['iMonitorId ','sMonitorName '] ... 그 오랜 시간을 보냈다는 것을 믿을 수 없다 " d "... 분자를 잡아 주셔서 감사합니다. – SerEnder

+0

나는 비슷한 문제가 있었다. 값 필드 사용을 제거하면 저에게 효과적입니다. 그것은 설명서에서 무엇을 해야하는지 명확하지 않다 + 단지 선택 이벤트를 깰 것으로 보인다. –