我有两个组合框,分别是组合1和组合2,其中填充了两个不同的商店(例如商店1和商店2)。 combo2中的值取决于在combo 1中选择的内容。然后我查询服务器以获取combo2的数组。换句话说,我在combo1中的选择确定了combo2的值。
我设置的代码无法正常工作,并给我一个非常普通的错误Error: Object doesn't support this action。我在浏览器调试器中看到返回值,所以我知道它不是我的ajax请求。我认为我在组合框中缺少一些小东西,无法显示值。请查看下面的代码以获得更好的主意


   var store1 = Ext.create('Ext.data.ArrayStore', {
  model: 'store1model',
  autoLoad: true,
  autoDestroy: true,
  proxy: {
    type: 'ajax',
    url: 'backend.java'
    extraParams: {
      'param1': param1
    },
    reader: {
      type: 'json'
    }



  }
});

var store2 = Ext.create('Ext.data.ArrayStore', {
  model: 'store2model',
  autoLoad: true,
  autoDestroy: true,
  storeId: 'store2Id',
  proxy: 'memory',
  readre: {
    type: 'json'
  }
});

var panel = Ext.create('Ext.form.Panel', {
  title: 'Panel',
  id: 'PanelId',
  url: 'backened.java',
  method: 'GET',
  items: [{
    xtype: container,
    layout: 'column',
    items: [{
      xtype: 'container',
      columnWidth: .5,
      layout: 'anchor',
      items: [{
        xtype: 'combobox',
        fieldLabel: 'Combo1',
        name: 'Combo1',
        store: store1,
        displayField: 'name',
        valueField: 'name',
        anchor: '96%',
        listeners: {
          select: function(combo, records) {
            Ext.Ajax.request({
              url: 'backend.java',
              method: 'GET',
              params: {
                "param2": combo.getValue()
              },
              success: function(response) {
                var data = Ext.Msg.decode(response.responseText);
                store2.loadData(data);
              }
            });
          }
        }
      }, {
        xtype: 'combobox',
        fieldLabel: 'Combo2',
        name: 'Combo2',
        id: 'Combo2',
        store: store2,
        displayField: 'someField',
        valueField: 'someField'

      }]

    }]
  }]


});


经过一些搜索后,我发现可能是我不得不听combo2中的事件更改。不知道这是否正确,以及那将如何工作?所以我想我的问题有两个方面。首先,为什么上面的代码不起作用?其次,是否有更好/更优雅的方法可以做到这一点。

编辑

 var store2 = Ext.create('Ext.data.ArrayStore', {
   model: 'store2model',
   autoLoad: true,
   autoDestroy: true,
   storeId: 'store2Id',
    proxy: {
     type: 'ajax',
     url: 'backend.java'
   //  extraParams: {
     //  'param2': param2
    // },
     reader: {
       type: 'json'
     }

   }
 });

最佳答案

看起来您已为store1分配了代理,以便可以执行store1.load(),也许尝试对store2进行相同操作。

因此,您可以将URL“ backend.java”分配为store2的代理,并且当选择combo1时,可以使用值为param的值加载combo2的商店。

  {
        xtype: 'combobox',
        fieldLabel: 'Combo1',
        name: 'Combo1',
        store: store1,
        displayField: 'name',
        valueField: 'name',
        anchor: '96%',
        listeners: {
          select: function(combo, records) {
            Ext.getCmp('Combo2').getStore().load({
                params: {
                  param2: combo.getValue()
                }
            });
          }
        }
      },


这将使用param2参数加载combo2的商店。因此,无论代理URL是什么,只需分配combo2的存储即可。试试吧?

关于javascript - 动态存储区未在组合框extjs中加载数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29286360/

10-10 18:47