【问题标题】:Dynamic store not loading data in combo box extjs动态存储未在组合框 extjs 中加载数据
【发布时间】:2015-05-30 22:27:24
【问题描述】:

我有两个组合框,即组合 1 和组合 2,其中填充了两个不同的商店(例如商店 1 和商店 2)。 combo2 中的值取决于在组合 1 中选择的内容。然后我查询服务器以获取组合 2 的数组。换句话说,我在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'
     }

   }
 });

【问题讨论】:

    标签: javascript extjs combobox extjs4


    【解决方案1】:

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

    因此,您可以将 url 'backend.java' 作为 store2 的代理分配,当 combo1 被选中时,您可以为 combo2 加载 store,值为参数。

      {
            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 的商店。试试看?

    【讨论】:

    • 我之前尝试过,但是当我使用 extraParams: { 'param2': param2 }, 定义 store2 的代理时,浏览器会抛出一个错误,提示 param2 is undefined。这就是我手动执行Ajax.request 的原因。抱歉,我应该在问题中提到这一点。这是有道理的,因为我还没有设置param2
    • 我不会用额外的参数声明商店。因为在您声明商店时,尚不知道额外的参数。相反,请尝试像我展示的那样在加载时将额外参数发送到哪里。使用上面的符号。根本不要使用任何额外的参数声明 store2 。您无需声明额外的参数即可在加载时随它一起发送。
    • 可能是我对proxy 缺乏了解,但是当我使用代理设置store2 时,我从未收到任何回复。查看控制台发现服务器从未接收到参数param2。请参阅编辑了解我如何设置store2
    • 不要在您的 store2 中执行 autoLoad: true。它应该只在您告诉它时加载(在combo1中选择一个值之后)。如果您使用我在侦听器中为组合 1 提供的代码,它应该加载并发送 param2。确保每次从 combo1 中选择一个项目时,都会向服务器发送一个请求。
    • 不将 ArrayStore 更改为 DataStore 并没有太大区别,但这样做确实让我在模型中发现了一个错误,从而解决了加载问题。 @MichaelWatson 和 Christophe 感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多