2014-09-12 2 views
0

내 콤보 박스를 Store에서 Panel로로드하려고합니다. "Extjs 스토어에서 콤보 박스로드

[ { :

{ xtype: 'combo', 
    fieldLabel: 'Farbe', 
    name: 'farbe', 
    store: colors , 
    queryMode: 'local', 
    displayField: 'name', 
    valueField: 'id' } 

loadFromDatabase.php 내 아약스 요청의 응답은 다음과 같습니다

var colors = new Object(); 

Ext.onReady(function(){ 

colors = Ext.create('Ext.data.Store', { 
    fields: ['id', 'name'], 
    autoLoad: true, 
    proxy: { 
     type: 'ajax', 
     url: 'app/view/main/loadFromDatabase.php', 
     reader: { 
      type: 'json', 
      rootProperty: 'name' 
     } 
    }, 
}); 

색상은이 같은 내 패널에서 나중에 조금을로드 할 id ":"1 ", "이름 ":"빨간색 " }, { "id ":"2 ", "이름 ":"파란색 " }, { "ID": "3", "이름": "녹색"}]

이 유효한 JSON처럼 보인다.

하지만 콤보 상자를 클릭하면 상자가 비어 있습니다. 뭐가 문제 야?

+0

당신이 그러나 name''의 루트 속성을 지정하고, 사용자의 응답이 'hasn t 루트 프로퍼티이므로 아마도'rootProperty : '''이거나 @ sreek521 예제에서'items'와 같은 루트 프로퍼티를 생성해야합니다. 'rootProperty : 'items'' – weeksdev

답변

0

내가

내가이 솔루션은 다른 더 나은 다음 알고하지는 타 솔루션을 발견하지만, 작동 :)

var colorsFromDB = []; 

var colors = Ext.create('Ext.data.Store', { 
    id: "colors", 
    fields: ['id', 'name'], 
    data : colorsFromDB 
}); 

Ext.Ajax.request({ 
    url: "app/view/main/loadFromDatabase.php", 
    method: 'POST', 
    success: function(r) { 
     var res = Ext.decode(r.responseText); 
     if (res !== null) { 
      Ext.each(res.colors, function(obj) { 
       colorsFromDB.push({ 
        id: obj.id, 
        name: obj.name 
       }) 
      }); 
      colors.loadData(colorsFromDB); 
     } 
    }, 
    failure: function(r) { 
     console.log(r.responseText); 
    } 
}); 
0

귀하의 JSON은 아래의 다음

'items': [{ 
       'name': 'Lisa', 
       "email": "[email protected]", 
       "phone": "555-111-1224" 
      }, { 
       'name': 'Bart', 
       "email": "[email protected]", 
       "phone": "555-222-1234" 
      }, { 
       'name': 'Homer', 
       "email": "[email protected]", 
       "phone": "555-222-1244" 
      }] 

var myStore = Ext.create('Ext.data.Store', { 
    fields:['name','email','phone'], 
    proxy: { 
     type: 'ajax', 
     url: '/yourpath.json', 
     reader: { 
      type: 'json', 
      root: 'items' 
     } 
    }, 
    autoLoad: true 
}); 

그래서 당신은 객체의 배열과 키로 JSON을하고있는 그 키를 지정해야 당신이 상점을 지정할 수 있습니다 같아야합니다 root 속성은 reader입니다. 일반 상점에서는 rootProperty 속성도 없습니다.

희망이 도움이됩니다.

+0

OP가 ExtJS 5 또는 Sencha Touch 2.3을 사용하는 경우,'rootProperty' 속성이 있습니다 : http://docs-origin.sencha.com/extjs/5.0/apidocs/#!/ api/Ext.data.reader.Reader-cfg-rootProperty 및 http://docs.sencha.com/touch/2.3.1/#!/api/Ext.data.reader.Reader-cfg-rootProperty를 참조하십시오. – Alexander

0

이 콤보에 이러한 추가 :

listeners : { 
    added : function(tis) { 
      tis.getStore().load(); 
    } 
} 

과 상점에 추가 할 :

listeners : { 
    load : function() { 
      Ext.getCmp('yourcomboid').setValue(Ext.getCmp('yourcomboid').getValue()); 
    } 
} 
마침내

은, 제 2의 로딩을 방지하기 위해, 콤보에 다음을 추가

mode : 'local' 

전체 코드 :

{ 
    xtype : 'combo', 
    fieldLabel : 'Role Selection', 
    id : 'role', 
    hiddenName : 'role', 
    hiddenValue : 1, 
    editable : false, 
    emptyText : 'Please select a role', 
    typeAhead : true, 
    triggerAction : 'all', 
    lazyRender : true, 
    mode : 'local', 
    listeners : { 
     added : function(
       tis) { 
      tis.getStore().load(); 
     } 
    }, 
    store : new Ext.data.JsonStore(
      { 
       url : 'getRole', 
       listeners : { 
        load : function() { 
         Ext.getCmp('role').setValue(Ext.getCmp('role').getValue()); 
        } 
       }, 
       fields : ['id','name' ], 
       root : 'resultList', 
      }), 
    displayField : 'name', 
    valueField : 'id' 
}