【问题标题】:ExtJS--changing proxy URL then loading store does not update gridExtJS-更改代理 URL 然后加载存储不更新网格
【发布时间】:2015-04-18 20:12:32
【问题描述】:

我有一个带有商店的网格,该商店在启动应用程序时加载。我也有一个网格绑定到的表格。最初,网格显示所有记录。搜索表单允许用户过滤记录。初始加载和搜索 URL 不同。单击搜索时,我将商店代理上配置的 URL 动态更改为过滤器 URL,将表单值作为 extraParams 传递,然后加载商店。我看到发出了请求并返回了响应。但是,我的网格记录没有刷新。

//网格存储在initComponent中

this.store = Ext.create("Ext.data.Store",{
      fields:["rptid", "text", "value", "date_created", "created_by", "active],
      autoLoad:true,
      proxy:{
        type:"ajax",
        url:"./getRpts.html",
        reader:{
          type:"json",
          root:"data"
        }
      }
    });

//搜索表单按钮的处理程序

this.getRPTGrid().getStore().getProxy().url = "./getFilteredReports.html";
    this.getRPTGrid().getStore().getProxy().extraParams = 
      this.getSearchForm().getValues();
    this.getRPTGrid().getStore().load();

就是这样。我确认正在发出请求以加载商店并确认在调试器中收到响应。 JSON 响应还包含“数据”根,所以这不是问题,字段也不会改变。我以前做过 10,000 次,但从未经历过。有人有什么想法吗?

我什至比较了两个请求的请求和响应标头,它们完全相同,但减去了 url 和参数..

【问题讨论】:

  • 很奇怪,我希望这也能奏效。在您的商店的负载处理程序中尝试更新网格视图。所以 this.getRPTGrid().getView().refresh() 看看这是否会强制行渲染。
  • 还有一件事,在您商店的负载处理程序中,插入断点并检查您的商店及其记录,在调用带有参数的新 url 后新的是否显示?
  • 我已经尝试过 getView().refresh() 但没有运气。我在加载后添加了一个断点,看到第一次点击搜索,新记录不显示。但是,我第二次单击搜索时,它确实显示了 store.data.items 下的新记录...但网格再次没有刷新。
  • 如果你遵循 extjs 的 MVC 模式。您需要从模型中动态更改它。正如我在回答中向您建议的那样。阅读this 文档,了解为什么需要模型来解决问题。这是关于您要向视图显示的数据绑定。使用模型,您可以根据需要动态提供数据模型。商店负责从与模型的结合中获取和保存数据。
  • 所以我没有在 initComponent 中创建商店,而是在商店文件夹下创建了一个单独的商店类。然后在 initComp 我做了 this.store = "MyGridStore" 并且它起作用了....为什么?我完全不知道。

标签: javascript extjs


【解决方案1】:

尝试使用重新加载来确保您的商店数据。 下面的代码在添加或更新后检查我的数据,所以如果我添加记录,它会自动重新加载我的商店并选择新记录。

var store = this.getRPTGrid().getStore();
Ext.Ajax.request({
    method: 'POST',
    url: "./getFilteredReports.html",
    params: {
        data: this.getSearchForm().getValues()
    },
    success: function(response) {
        store.reload({
            callback: function() {
                var newRecordIndex = store.findBy(
                    function(record, id) {
                        if (record.get(
                            'rptid'
                        ) === values.rptid) {
                            return true;
                        }
                        return false;
                    });
                getRPTGrid.getSelectionModel().select(
                    newRecordIndex);
            }
        });
    }
});

如果您想更改代理 url 以更新您的商店,请尝试在您的模型中更新代理,而不是在您的商店中,如下所示:

Ext.define('APP.model.m_gis', {
    extend: 'Ext.data.Model',
    alias: 'widget.gisModel',
    proxy: {
        type: 'jsonp',
        url: './getRpts.html',
        reader: {
            type: 'json',
            root: 'data',
            totalProperty: 'totalCount'
        }
    },
    fields: ["rptid", "text", "value", "date_created", "created_by",
        "active"
    ]
});

这是商店的样子:

Ext.define('APP.store.s_gis', {
    extend: 'Ext.data.Store',
    alias: 'widget.gisStore',
    model: 'APP.model.m_gis'
});

并根据需要更改您的代理:

var place_store = Ext.create('APP.store.s_gis');

place_store.getProxy().setExtraParam('url', "./getFilteredReports.html");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 2011-08-18
    • 2017-07-28
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多