Javascript 在ExtJS4中将存储加载到组合框时,如何发送额外的参数?

Javascript 在ExtJS4中将存储加载到组合框时,如何发送额外的参数?,javascript,extjs,extjs4,extjs4.1,extjs4.2,Javascript,Extjs,Extjs4,Extjs4.1,Extjs4.2,在ExtJS4中使用组合框存储时,如何发送额外参数 我知道我可以在代理设置中使用“extraParams”,但这将影响使用同一存储的所有元素 也就是说,如果我有一个网格,它使用一个名为“Users”的存储,该存储将列出系统中的所有用户。同时,我有一个组合框,它也使用存储“Users”,但这次我想列出所有具有“status=2”的用户,因此我想在Ajax调用中将参数“&status=2”发送到后端 如果我使用类似于: store.getProxy().extraParams = { statu

在ExtJS4中使用组合框存储时,如何发送额外参数

我知道我可以在代理设置中使用“extraParams”,但这将影响使用同一存储的所有元素

也就是说,如果我有一个网格,它使用一个名为“Users”的存储,该存储将列出系统中的所有用户。同时,我有一个组合框,它也使用存储“Users”,但这次我想列出所有具有“status=2”的用户,因此我想在Ajax调用中将参数“&status=2”发送到后端

如果我使用类似于:

store.getProxy().extraParams = {
  status: 2
};
store.load({
  params:{
    'foo1': bar1,
    'foo2': bar2
  } 
});
它将工作,但网格将同时更新为也使用“&status=2”。我只希望组合框使用参数

我想我可以关闭网格上的“自动更新”,然后在组合框上的“渲染”事件上设置“extraParams”,然后在组合框隐藏时取消设置,但这将是一个非常糟糕的解决方案

我还可以将存储复制为“Users2”,并将其用于组合框,但这也是一个丑陋的解决方案

正确的方法是什么?这对大多数人来说一定是件很平常的事

更新1:

我知道我可以使用类似于:

store.getProxy().extraParams = {
  status: 2
};
store.load({
  params:{
    'foo1': bar1,
    'foo2': bar2
  } 
});
但是在ExtJS4MVC中如何使用它呢?我只是在表单对象中指定了“store:Users”。如何将这些额外参数发送到.load()函数

我尝试了以下方法:

{
xtype: 'combobox',
fieldLabel: 'Server',
name: 'server',

//store: 'ServersIP',
store: new Cloud.store.ServersIP(),

/*
listeners: {
    beforeload: function(store, options) {
        console.log(store);
    }
},
*/

valueField: 'id',
displayField: 'name_id',
emptyText: 'Select a Server...',
editable: false
},
但是,它给出了错误“UncaughtTypeError:无法读取未定义的属性'ServersIP'”

但名称是正确的:

Ext.define('Cloud.store.ServersIP', {

extend: 'Ext.data.Store',
model: 'Cloud.model.Server', 
还有,我应该把听众放在哪里?我想我在我的例子中也没有得到正确的答案

更新2:

我现在有一个更进一步的解决方案:

store: Ext.create('Cloud.store.ServersIP', {
proxy: {
    extraParams: {
        param1: 'value1',
        param2: 'value2'
    }
},                          
}),
上述方法不起作用。如果在Ext.Create的参数中只有一个“one-level”变量,它就可以工作。出于某种原因,当我传入proxy=>extraParams=>param1时,它不喜欢它

这一个有效:

store: Ext.create('Cloud.store.ServersIP', {
aaa: 'bbb'
}),
但当然,我的超参数不在那里。有人知道如何修复最后一部分吗?

您可以在商店中将其设置为false,然后自己调用该方法,并使用以下选项:

如果您需要只加载一次组合,然后在本地模式下进行查询,那么这将起作用。如果需要组合键对服务器进行多个调用(远程模式),请在存储时设置参数:

comboStore.on('beforeload', function(store, operation) {
    operation.params = operation.params || {};
    operation.params.status = 2;
});

您可以创建同一存储的新实例,而不是引用与网格相同的存储。这样,两个存储实例将分别管理


因此,在您的表单中将
store:'Users'
替换为
store:new MyApp.store.Users()
,然后您可以使用对您更有效的方法(extraparams、load with params、beforeload listener等)

这是我能想到的最好的代码。不需要侦听器:)

创建“用户”的新实例-存储并更改其中的参数

xtype: 'combobox',
fieldLabel: 'Users',
name: 'users',

store: (function() {
  var s = Ext.create('MyApp.store.Users');
  s.proxy.extraParams = {
    active: '1'
  }
  return s;
})(),

我刚刚解决了这个问题。 combobox queryMode:带有额外参数的远程

只需在initComponent中的视图“中实例化存储,并覆盖代理

//instantiate the store

var store = Ext.create('Cloud.store.ServersIP', {
    storeId: 'YourStoreId'
});
store.proxy.extraParams = { param1: 'value1', param2: 'value2' };
在xtype:combobox中

//set combobox store

{
    xtype: 'combobox',
    queryMode:'remote',
    store : Ext.data.StoreManager.lookup('YourStoreId'),
    ...
    ...
}

我希望您理解我建议的解决方案。

您可以捕获“beforeload”存储事件并更改当前加载操作。 这样,参数就不会持久存在于其他请求中

Ext.create('Ext.data.Store', {
    model: MyModel,
    autoLoad: true,
    listeners:{
        // Fires before a request is made. op is an Ext.data.Operation object
        beforeload:function(store,op){ 
            // Set request parameters (without overriding other parameters)
            op.params = Ext.apply(op.params||{},{
                someParam:true
            });
        }
    }
});

您的示例没有使用ExtJS4中使用的MVC。如何在MVC中指定这些加载参数?在这里,我在表单对象上设置了“Store:Users”。此外,网格也使用相同的存储。将存储设置为“autoLoad=false”将迫使我在使用存储的所有位置手动加载存储。在我的应用程序中,我在很多地方都使用该存储。在网格和组合中使用相同的存储实例是在寻求问题。当您的组合将过滤其存储以应用其查询时,这也将过滤您的网格。那可能不是你想要的。您应该通过提供带有
xtype
xclass
的配置来为combo提供自己的存储。是的,这就是我现在使用的方式,但我认为这是一个丑陋的解决方案。我希望能够使用一个通用存储,然后根据使用存储的对象应用参数。与此类似,网格可能需要“&status=1&clean=1”,组合框可能需要“&status=2&clean=0”。ExtJS默认不支持这一点,这真是太糟糕了。所需要的只是能够将“参数”直接放在使用存储的对象上。还有一个您忽略的问题,那就是视图的数据绑定。如果在一个视图中更改同一存储实例,另一个视图将随之更改,从而导致奇怪的意外问题。向存储添加beforeload侦听器这听起来正是我想要的。然而,我无法让它工作。我已经更新了我的问题。可以确认它不起作用。试了三天。。。不走运,这是一个带有过滤器和存储的extjs错误。您甚至不能将额外的参数作为post结果。代理在存储类的所有实例(以及关联模型)之间共享,因此,这将为
MyApp.store.Users
的所有实例设置额外参数。我的测试结果显示,它确实为MyApp.store.Users.Reviewer的所有实例设置了额外参数。请简要说明您的代码是如何工作的,以帮助询问者更好地理解它。@TheZver,在ExtJS6.0.1中,我必须对它进行一点更新:op.setParams(Ext.apply(op.getParams()| |{},{。。。