在ExtJS 4中将商店加载到组合框时如何发送额外的参数?

Dan*_*sta 10 javascript extjs extjs4 extjs4.1 extjs4.2

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

我知道我可以在代理设置中使用"extraParams",但这会影响使用同一商店的所有元素.

即如果我有一个使用名为"用户"的商店的网格,它将列出系统中的所有用户.同时,我有一个组合框,也使用商店"用户",但这次我想列出所有"status = 2"的用户,因此我想发送参数"&status = 2" Ajax调用后端.

如果我使用类似的东西:

store.getProxy().extraParams = {
  status: 2
};
Run Code Online (Sandbox Code Playgroud)

它可以工作,但Grid会同时更新为使用"&status = 2".我只想让组合框使用参数.

我想我可以关闭Grid上的"autoupdate",然后在组合框上的"render"事件上设置"extraParams",然后在组合框被隐藏时取消设置,但这将是一个非常难看的解决方案.

我也可以将商店复制到"Users2"并将其用于组合框,但这也是一个丑陋的解决方案.

这样做的正确方法是什么?对大多数人来说,它一定是很常见的事情.

更新1:

我知道我可以使用类似的东西:

store.load({
  params:{
    'foo1': bar1,
    'foo2': bar2
  } 
});
Run Code Online (Sandbox Code Playgroud)

但是我如何在ExtJS 4 MVC中使用它呢?在那里,我只在表单对象中指定"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
},
Run Code Online (Sandbox Code Playgroud)

但是,它会出现错误"Uncaught TypeError:无法读取未定义的属性'ServersIP'"

但名字是正确的:

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

extend: 'Ext.data.Store',
model: 'Cloud.model.Server', 
Run Code Online (Sandbox Code Playgroud)

另外,我究竟会把听众放在哪里?我想我在我的例子中没有得到那个正确的吗?

更新2:

我现在对解决方案有了更多的了解:

store: Ext.create('Cloud.store.ServersIP', {
proxy: {
    extraParams: {
        param1: 'value1',
        param2: 'value2'
    }
},                          
}),
Run Code Online (Sandbox Code Playgroud)

以上不起作用.如果我在Ext.Create的参数中只有一个"一级"变量,它就可以工作.出于某种原因,当我传入proxy => extraParams => param1时,它不喜欢它.

这个工作:

store: Ext.create('Cloud.store.ServersIP', {
aaa: 'bbb'
}),
Run Code Online (Sandbox Code Playgroud)

但当然,我的extraParams不存在.有谁知道如何修复这最后一部分?

小智 8

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

只是在initComponent中的"VIEW"中实例化商店并覆盖代理

//instantiate the store

var store = Ext.create('Cloud.store.ServersIP', {
    storeId: 'YourStoreId'
});
store.proxy.extraParams = { param1: 'value1', param2: 'value2' };
Run Code Online (Sandbox Code Playgroud)

并在xtype:组合框

//set combobox store

{
    xtype: 'combobox',
    queryMode:'remote',
    store : Ext.data.StoreManager.lookup('YourStoreId'),
    ...
    ...
}
Run Code Online (Sandbox Code Playgroud)

我希望你理解我提出的解决方案.


Dan*_*sta 1

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

创建“用户”存储的一个新实例并更改该实例中的参数。

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

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