在ExtJS 4中为组合框使用商店时,如何发送额外参数?
我知道我可以在代理设置中使用“extraParams”,但这会影响使用同一商店的所有元素。
即如果我有一个使用名为“Users”的商店的网格,它将列出系统中的所有用户。同时,我有一个组合框,也使用商店“用户”,但这次我想列出所有“status = 2”的用户,因此我想发送参数“& status = 2”关于Ajax对后端的调用。
如果我使用类似的东西:
store.getProxy().extraParams = {
status: 2
};
它可以工作,但Grid会同时更新为也使用“& status = 2”。我只想让组合框使用参数。
我想我可以在Grid上关闭“autoupdate”,然后在组合框上的“render”事件上设置“extraParams”,然后在组合框被隐藏时取消设置,但是这将是一个非常难看的解决方案。
我也可以将商店复制到“Users2”并将其用于组合框,但这也是一个丑陋的解决方案。
这样做的正确方法是什么?对大多数人来说,这一点非常普遍。
更新1:
我知道我可以使用类似的东西:
store.load({
params:{
'foo1': bar1,
'foo2': bar2
}
});
但是我如何在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
},
然而,它给出了错误“Uncaught TypeError:无法读取未定义的属性'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的参数中只有一个“一级”变量,它就可以工作。出于某种原因,当我传入proxy =>时,它不喜欢它extraParams =>参数1。
这个有效:
store: Ext.create('Cloud.store.ServersIP', {
aaa: 'bbb'
}),
但当然,我的extraParams不存在。任何人都知道如何修复这最后一部分?
答案 0 :(得分:8)
我刚刚解决了这个问题。 combobox queryMode:带有额外参数的远程。
只需在" VIEW" 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'),
...
...
}
我希望你理解我提出的解决方案。
答案 1 :(得分:2)
您可以创建同一商店的新实例,而不是引用与网格相同的商店。这样,两个商店实例将单独管理。
因此,在您的表单中将store: 'Users'
替换为store: new MyApp.store.Users()
,然后您可以使用哪种方法更适合您(extraparams,加载params,beforeload listener等)
答案 2 :(得分:2)
你可以赶上' 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
});
}
}
});
答案 3 :(得分:1)
您可以在商店中将autoLoad
设置为false,然后自行调用load
方法,并使用params
选项:
var store = Ext.create('My.Store', {
autoLoad: false
...
});
store.load({
params: {status: 2}
});
如果您只需要加载一次,然后在本地模式下查询,那么这将有效。如果您需要组合来多次调用服务器(远程模式),请在商店的beforeload
事件中设置参数:
comboStore.on('beforeload', function(store, operation) {
operation.params = operation.params || {};
operation.params.status = 2;
});
答案 4 :(得分:1)
这是我能想到的最好的代码。不需要听众:)
创建“users”-store的新实例并更改该用户中的参数。
xtype: 'combobox',
fieldLabel: 'Users',
name: 'users',
store: (function() {
var s = Ext.create('MyApp.store.Users');
s.proxy.extraParams = {
active: '1'
}
return s;
})(),