Javascript 动态存储未在组合框extjs中加载数据

Javascript 动态存储未在组合框extjs中加载数据,javascript,extjs,combobox,extjs4,Javascript,Extjs,Combobox,Extjs4,我有两个组合框,分别是combo 1和combo 2,它们由两个不同的商店(分别是store 1和store 2)填充。combo2中的值取决于Combo1中选择的内容。然后我查询服务器以获取combo2的数组。换句话说,我在combo1中的选择决定combo2的值。 我设置的代码不起作用,给了我一个非常一般的错误错误:对象不支持此操作。我在浏览器调试器中看到返回值,因此我知道这不是我的ajax请求。我想我在组合框中遗漏了一些小东西,这些小东西可以防止显示值。请参阅下面的代码以获得更好的想法 经

我有两个组合框,分别是combo 1和combo 2,它们由两个不同的商店(分别是store 1和store 2)填充。combo2中的值取决于Combo1中选择的内容。然后我查询服务器以获取combo2的数组。换句话说,我在combo1中的选择决定combo2的值。 我设置的代码不起作用,给了我一个非常一般的错误
错误:对象不支持此操作
。我在浏览器调试器中看到返回值,因此我知道这不是我的
ajax
请求。我想我在组合框中遗漏了一些小东西,这些小东西可以防止显示值。请参阅下面的代码以获得更好的想法

经过一些搜索,我发现可能是我不得不听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时,您可以为combo2加载值为param的存储

  {
        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的存储。因此,只要分配combo2的存储,不管代理url是什么。也许可以试试吗?

我以前也试过,但是当我使用
extraParams:{'param2':param2}为store2定义代理时,
浏览器会向我抛出一个错误,说
param2未定义。这就是为什么我手动执行Ajax.request。对不起,我应该在问题中提到这一点。这很有意义,因为我还没有设置
param2
。我不会用额外的参数声明存储。因为在您声明存储时,额外的参数还不知道。相反,试着像我展示的那样在加载时将额外的参数发送到哪里。使用上面的符号。不要用任何额外的参数声明store2。您不必声明额外的参数以便在加载时随附发送。可能是因为我对
proxy
缺乏了解,但当我使用proxy设置
store2
时,我从未收到响应。从控制台上看,服务器从未收到参数
param2
。请参阅编辑,了解我如何设置
store2
不要在您的store2中自动加载:true。它应该只在您告诉它时加载(在combo1中选择一个值之后)。如果使用我在combo1的侦听器中提供的代码,它应该加载并发送param2。确保每次从combo1中选择一个项目时,都会向服务器发送一个请求。将ArrayStore更改为DataStore并没有多大区别,但这样做确实会让我发现模型中的一个输入错误,从而修复了加载问题@迈克尔沃森和克里斯托夫谢谢你的帮助!
 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'
     }

   }
 });
  {
        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()
                }
            });  
          }
        }
      },