Gridview Ext JS如何告诉PagingToolbar使用父网格存储?

Gridview Ext JS如何告诉PagingToolbar使用父网格存储?,gridview,extjs,Gridview,Extjs,我正在尝试构建一个应用程序,该应用程序使用服务器作为非本机JSON传递的单个配置(可以包含函数)。到目前为止一切正常,但我很好奇为什么PagingToolbar没有使用父网格存储的选项 我曾尝试像这样在配置中设置存储,但没有成功: {... store:Ext.StoreMgr.lookup('unique_store_id') } 有没有办法不为我的应用程序中定义存储、网格和其他项的每个视图编写大量javascript,或者至少扩展使用父对象选项的分页工具条的功能 更新, 下面是服务器

我正在尝试构建一个应用程序,该应用程序使用服务器作为非本机JSON传递的单个配置(可以包含函数)。到目前为止一切正常,但我很好奇为什么PagingToolbar没有使用父网格存储的选项

我曾尝试像这样在配置中设置存储,但没有成功:

{...
   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 ) }}},