Gridview Ext JS如何告诉PagingToolbar使用父网格存储?
我正在尝试构建一个应用程序,该应用程序使用服务器作为非本机JSON传递的单个配置(可以包含函数)。到目前为止一切正常,但我很好奇为什么PagingToolbar没有使用父网格存储的选项 我曾尝试像这样在配置中设置存储,但没有成功:Gridview Ext JS如何告诉PagingToolbar使用父网格存储?,gridview,extjs,Gridview,Extjs,我正在尝试构建一个应用程序,该应用程序使用服务器作为非本机JSON传递的单个配置(可以包含函数)。到目前为止一切正常,但我很好奇为什么PagingToolbar没有使用父网格存储的选项 我曾尝试像这样在配置中设置存储,但没有成功: {... store:Ext.StoreMgr.lookup('unique_store_id') } 有没有办法不为我的应用程序中定义存储、网格和其他项的每个视图编写大量javascript,或者至少扩展使用父对象选项的分页工具条的功能 更新, 下面是服务器
{...
store:Ext.StoreMgr.lookup('unique_store_id')
}
有没有办法不为我的应用程序中定义存储、网格和其他项的每个视图编写大量javascript,或者至少扩展使用父对象选项的分页工具条的功能
更新,
下面是服务器响应的简短示例(缩小)
PagingToolbar没有链接到网格以用于其存储的原因是PagingToolbar可以与支持分页的任何组件一起使用,而不仅仅是网格,因此您必须显式地将存储分配给它(这可能是其他组件也使用的共享存储)
不确定您的代码为什么不能工作——我假设您的查找调用一定没有返回有效的存储引用。两种明显的可能性是id错误,或者商店还不存在。由于您没有发布任何其他代码,因此不可能再发布其他代码。顺便说一句,您应该能够简单地将网格使用的存储引用直接分配到工具栏,而无需进行查找,但我想这取决于您的应用程序的结构。您在定义时执行的配置-通常在实例化之前执行。因此
Ext.StoreMgr.lookup('domain-store')
将在网格构造函数发生之前发生
这是ExtJS使用静态配置方式的一个缺点。您需要做的是覆盖网格,然后通过编程设置工具栏的存储,或者在网格上使用beforerender事件,如下所示:
//...grid config
listeners: {'beforerender' : {fn:function(){ this.getBottomToolbar().store = this.store }}}
编辑:将bbar更改为getBottomToolbar()。另一种可能性是创建GridPanel的子类。此子类的构造函数可以检查其给定配置的PagingToolbar配置。如果存在,则实例化存储(如果需要),并将其引用到PagingToolbar配置
var MyGridPanel = Ext.extend(Ext.grid.GridPanel, {
constructor: function( cfg ) {
if ( cfg && cfg.store && cfg.bbar && cfg.bbar.xtype == 'paging'
&& ! (cfg.bbar instanceof Ext.PagingToolbar && ! this.bbar.store
) {
if ( cfg.store.xtype && ! (cfg.store instanceof Ext.data.Store) ) {
cfg.store = Ext.ComponentMgr.create(cfg.store);
}
cfg.bbar.store = cfg.store;
}
MyGridPanel.superclass.constructor.call(this, cfg);
}
});
用法示例:
(new Ext.Window({
width: 400,
height: 200,
layout: 'fit',
items: new MyGridPanel({
store: {
xtype: 'arraystore',
fields: ['name', 'value'],
data: [
['name 1', 'value 1'],
['name 2', 'value 2']
]
},
columns: [
{
dataIndex: 'name',
header: 'Name'
},
{
dataIndex: 'value',
header: 'Value'
}
],
bbar: {
xtype: 'paging',
pageSize: 25
}
})
})).show();
另一个选项是使用createInterceptor将上述行为直接应用于GridPanel:
Ext.grid.GridPanel.prototype.initComponent =
Ext.grid.GridPanel.prototype.initComponent.createInterceptor(function() {
if ( this.store && this.bbar && this.bbar.xtype == 'paging'
&& ! (this.bbar instanceof Ext.PagingToolbar) && ! this.bbar.store
) {
if ( this.store.xtype && ! (this.store instanceof Ext.data.Store) ) {
this.store = Ext.ComponentMgr.create(this.store);
}
this.bbar.store = this.store;
}
});
这将允许您继续使用xtype:“grid”。实际上,在3.2.0上,listnere对我不起作用(它填充了网格,但不允许我更改页面)。问题是ext不知道它必须重建工具栏(因为您刚刚修改了一个变量)。固定波纹管:
listeners: {'beforerender' : {fn:function(){ this.getBottomToolbar().bindStore(this.store ) }}},
我通过将服务器响应传递给Ext.ComponentManager.create({…})和正确的xtype来创建所有元素。因此,大多数元素都是基于返回的对象动态生成的。在这种情况下,存储定义在网格对象内部,如果需要,可以通过ID访问,但在我的情况下,ID不起作用,但是在Firebug存储中,可以使用这个StoreMgr.lookupWell访问,如果您声称StoreMgr调用返回的是有效的存储引用,那么代码中显然存在其他错误。由于您尚未发布任何其他配置或应用程序代码,因此无法进一步帮助您。以下是返回的服务器响应。@bmoeskau。。我也遇到了同样的问题,但只有在使用“sencha app build”构建/缩小ExtJS之后。在调用Ext.PagingToolbar之前,我如何轻松地强制商店存在?感谢Igor提供的示例,但它不能以这种方式工作,因为某些原因,tbar和bbar中的项目无法通过DOM直接使用。无论我是如何通过afterrender listerner使其工作的,并通过这个访问bbar的。getBottomToolbar()是的,我忘记了bbar只是一个配置属性。感谢Owless提供的示例,它也可能是我的应用程序的解决方案。有没有什么方法可以覆盖默认的网格配置,为底部工具栏添加额外的验证。刚刚有了最大的DOH!!!片刻。我没有意识到可以将
构造函数作为函数放入传递给Ext.extend
的对象中。但这当然是有道理的——构造函数只是原型上的一个函数,所有这些函数都是这样做的。一直以来,我都在将构造函数定义为函数,然后对其进行扩展。这样代码就更干净了。你在问什么样的额外验证,纳扎里?您希望能够对config对象执行的任何操作方式都可以在上述示例的构造函数中执行。更高级的修改也可以通过重写其他方法或添加事件侦听器来应用。我想它是否可以使用Ext.apply()而不是Ext.extend()?我在回答中添加了另一种技术,使用createInterceptor修改GridPanel本身,而不是创建子类。这和你想要的更接近吗?
listeners: {'beforerender' : {fn:function(){ this.getBottomToolbar().bindStore(this.store ) }}},