为什么我不能使用JSONStore在EXTjs 4中使用简单的Combobox?

时间:2011-05-16 18:49:16

标签: json extjs combobox extjs4

这让我疯了。我有一个JS文件:

  Ext.onReady(function(){
     Ext.QuickTips.init();

     var SitesStore = new Ext.data.JsonStore({
        autoLoad: true,
        fields: [{
           name: 'id',
           mapping: 'id'
        }, {
           name: 'name',
           mapping: 'name'
        }],
        proxy: {
           type: 'ajax',
           url : '/sites/getsites.do'
        },
        storeId: 'SitesStore',
        root: 'sites',
        url: '/sites/getsites.do',
        xtype: 'jsonstore'
     });

     SitesStore.load(function(data){
        Ext.create('Ext.form.ComboBox', {
           fieldLabel: 'Choose Site...',
           store: SitesStore,
           data: data[0].raw["sites"],
           queryMode: 'remote',
           displayField: 'name',
           valueField: 'id',
           renderTo: "timesheetSearch"
        });

        console.log(data[0].raw["sites"]);
     });

  }); //end onReady

我的/sites/getsites.do按以下格式返回JSON个数据:

{
    -sites: [
        -{
            id: "12345678"
            name: "Blah Warehouse"
        },
        -{
            id: "5999B91DF6C0"
            name: "WalMart Warehouse"
        },
        ...
}

我意识到data[0].raw["sites"]可能不是访问数据的首选方式,但我确实已确认数据正在填充,而我正在返回136 sites

combobox DOES 呈现。但是,实时搜索不起作用且没有条目。

我是ExtJS的新手。

任何提示都将不胜感激。

由于

更新

此代码工作

var SitesStore = Ext.create('Ext.data.Store', {
    autoLoad: true,
    fields: ['id','name'],
    data: [{'id':'aaaa', 'name':'Honeywell'}],
    storeId: 'SitesStore',
    root: 'sites'
});

Ext.create('Ext.form.ComboBox', {
    fieldLabel: 'Choose Site...',
    store: SitesStore,
    queryMode: 'remote',
    displayField: 'name',
    triggerAction: 'all',
    valueField: 'id',
    renderTo: "timesheetSearch"
});

NOT

var SitesStore = Ext.create('Ext.data.Store', {
    autoLoad: true,
    fields: ['id','name'],
    proxy: {
        type: 'ajax',
        url: '/sites/getsites.do'
    },
    storeId: 'SitesStore',
    root: 'sites'
});

Ext.create('Ext.form.ComboBox', {
    fieldLabel: 'Choose Site...',
    store: SitesStore,
    queryMode: 'remote',
    displayField: 'name',
    triggerAction: 'all',
    valueField: 'id',
    renderTo: "timesheetSearch"
});

当我在没有proxy的情况下运行它(并指定url)时,我收到错误消息,说我没有指定代理。

由于

更新

UGH !!!!!!

我明白了。这是正确的JSONStore

var SitesStore = Ext.create('Ext.data.Store', {
    autoLoad: true,
    fields: ['id','name'],
    proxy: {
        type: 'ajax',
        url: '/sites/getsites.do',
        reader: {
            type:'json',
            root: 'sites'
        }
    },
    storeId: 'SitesStore',
    root: 'sites'
});

谢谢大家。无法相信这有多难。主要是因为我找不到一个好的教程。洛尔

2 个答案:

答案 0 :(得分:1)

这有点脏,我的第一条ExtJS4线(我习惯于v2.x / 3.x),但它应该可以工作。我看到你使用带控制台的浏览器,这样你就可以调试是否有错误。您还应该查看API

 var SitesStore = new Ext.data.JsonStore({
    autoLoad: true,
    fields: [{
       name: 'id',
       mapping: 'id'
    }, {
       name: 'name',
       mapping: 'name'
    }],
    proxy: {
       type: 'ajax',
       url : '/sites/getsites.do'
    },
    storeId: 'SitesStore',
    root: 'sites',
    url: '/sites/getsites.do'
    // ,xtype: 'jsonstore'
 });

  Ext.onReady(function(){
     Ext.QuickTips.init();


    Ext.create('Ext.form.ComboBox', {
       fieldLabel: 'Choose Site...',
       store: SitesStore,
       // data: data[0].raw["sites"],
       queryMode: 'remote',
       displayField: 'name',
       valueField: 'id',
       renderTo: "timesheetSearch",
       listeners:{
            scope: this,
            'select': function(field, value){
                console.log(value);
            }
        }

    });
  });

答案 1 :(得分:1)

<强>更新

我能够弄清楚这一点。这是工作代码:

var SitesStore = Ext.create('Ext.data.Store', {
     autoLoad: true,
     fields: ['id','name'],
     proxy: {
        type: 'ajax',
        url: '/sites/getsites.do',
        reader: {
           type:'json',
           root: 'sites'
        }
     },
     storeId: 'SitesStore',
     root: 'sites'
  });

  Ext.create('Ext.form.ComboBox', {
     fieldLabel: 'Choose Site...',
     store: SitesStore,
     queryMode: 'remote',
     displayField: 'name',
     triggerAction: 'all',
     valueField: 'id',
     renderTo: "timesheetSearch"
  });

我永远无法让JSONStore工作,所以我创建了一个标准Store,并且必须将reader属性与我的JSON数据相匹配。

希望这有助于某人。