【问题标题】:How to retrieve JSON Data Array from ExtJS Store如何从 ExtJS 存储中检索 JSON 数据数组
【发布时间】:2011-02-01 09:01:44
【问题描述】:

有没有一种方法可以让我在 ExtJS 网格面板中返回我存储的数据,就像我使用加载它的方式一样:

var data = ["value1", "value2"]
Store.loadData(data);

我希望有一个用户选项来重新加载网格,但需要考虑对商店的更改。用户可以进行更改并且网格会动态更新,但如果我重新加载网格,即使数据库已使用新更改进行更新,也会显示最初加载的数据。我不希望重新加载页面,而是让他们使用新更改的存储重新加载网格数据本身。

我想我正在寻找这样的东西:

var data = Store.getData();
//data = ["value1", "value2"]

说到底。或者是否有另一种方法可以用我不知道的新数据刷新网格。即使使用代理仍然使用“原始”数据,而不是新存储。

【问题讨论】:

  • 所有这些解决方案在 EXTjs5 sencha.com/forum/… 中都有一个基本问题,仍然不知道是 bug 还是功能

标签: extjs


【解决方案1】:

Store.getRange() 似乎正是您要搜索的内容。它将返回您Ext.data.Record[] - 记录数组。如果不传递任何参数,则返回所有记录。

【讨论】:

  • 我在寻找 Store.getRange().json
  • @user291928 :老实说,您没有指定您需要数据的格式,这个答案似乎有所帮助。我建议你选择一个答案。
  • +1 另外,旧链接已失效。方便他人:docs.sencha.com/extjs/4.2.0/#!/api/…
  • 耶稣!为什么getRange()?为什么?
  • 好的,所以你想要一个“范围”的记录,然后它返回一个“范围”的项目......有什么不明白的?
【解决方案2】:
 function getJsonOfStore(store){
        var datar = new Array();
        var jsonDataEncode = "";
        var records = store.getRange();
        for (var i = 0; i < records.length; i++) {
            datar.push(records[i].data);
        }
        jsonDataEncode = Ext.util.JSON.encode(datar);

        return jsonDataEncode;
    }

【讨论】:

    【解决方案3】:

    单线方法:

    var jsonData = Ext.encode(Ext.pluck(store.data.items, 'data'));

    不是很漂亮,但很短。

    【讨论】:

    • 它也适用于 3.3.1 - 在文档中 - 自从我发现这篇文章后,我就完全成功地使用它并认为它很漂亮
    • 此方法自 4.0.0 起已被弃用
    • 如果您使用的是 >= 4.0.0 版本,则必须使用 Ext.Array.pluck docs.sencha.com/extjs/4.2.2/#!/api/Ext.Array-method-pluck
    【解决方案4】:

    试试这个:

    myStore.each( function (model) {
        console.log( model.get('name') ); 
    }); 
    

    【讨论】:

    • 你重写了'pluck'函数?
    【解决方案5】:

    一种更好的 (IMO) 单行方法,适用于 ExtJS 4,不确定 3:

    store.proxy.reader.jsonData
    

    【讨论】:

    【解决方案6】:

    我在尝试从 store 访问数据而不将其绑定到组件时遇到了麻烦,其中大部分是因为 store 是通过 ajax 加载的,因此需要使用 load 事件来读取数据。这有效:

    store.load();
    store.on('load', function(store, records) {
        for (var i = 0; i < records.length; i++) {
        console.log(records[i].get('name'));
        };
    });
    

    【讨论】:

      【解决方案7】:

      一个简单的方法是

      var jsonArray = store.data.items
      

      所以如果你的 JSON 存储是

      [{"text": "ABC"}, {"text": "DEF"},{"text": "GHI"},{"text": "JKL"}]
      

      然后您可以将“DEF”检索为

      jsonArray[1].data.text
      

      在下面的代码中,我注意到它将每个字符转换为一个数组项。

      var jsonData = Ext.encode(Ext.pluck(store.data.items, 'data'));
      

      【讨论】:

        【解决方案8】:

        我总是使用store.proxy.reader.jsonDatastore.proxy.reader.rawData

        例如 - 这将返回嵌套在名为“数据”的根节点中的项目:

        var some_store = Ext.data.StoreManager.lookup('some_store_id');
        Ext.each(some_store.proxy.reader.rawData.data, function(obj, i){
           console.info(obj);
        });
        

        这仅在存储读取操作之后立即起作用(尚未被操作)。

        【讨论】:

        • 一些示例代码或示例链接会更好!
        • 应该使用getter而不是直接引用,所以上面的例子(已经给出!?)是最佳实践。
        • @Dawesi 上面的示例暗示加载存储(这使得它成为代理加载) - 与在加载后访问任何存储代理的 JSON 数组。最佳做法仍然是阅读问题,然后再否决正确答案。 store的model和proxy的json数组不一样。
        • 让您知道:最佳实践是使用 getter 和 setter:some_store.getProxy().getReader().rawDatadocs.sencha.com/extjs/6.5.3/modern/…
        【解决方案9】:

        这是另一种简单的干净方式:

        var jsonArr = [];
        grid.getStore().each( function (model) {
            jsonArr.push(model.data);
        });
        

        【讨论】:

          【解决方案10】:

          您无需进行任何循环并收集/重新处理数据。你需要的json对象在这里:

          var jsonData = store.proxy.reader.jsonData;
          

          【讨论】:

          • 这将获取原始商店数据,而不是可能已被修改的更新商店数据
          【解决方案11】:
          proxy: {
                  type: 'ajax',
                  actionMethods: {
                      read: 'POST',
                      update: 'POST'
                  },
                  api: {
                      read: '/bcm/rest/gcl/fetch',
                      update: '/bcm/rest/gcl/save'
                  },
                  paramsAsJson: true,
                  reader: {
                      rootProperty: 'data',
                      type: 'json'
                  },
                  writer: {
                      allowSingle: false,
                      writeAllFields: true,
                      type: 'json'
                  }
              }
          

          使用allowSingle它会转换成数组

          【讨论】:

            【解决方案12】:

            如果您想获得与Writer 完全相同的数据(例如忽略带有persist:false 配置的字段),请使用以下代码(注意:我在Ext 5.1 中测试过)

              var arr = [];   
            
                this.store.each(function (record) {
                    arr.push(this.store.getProxy().getWriter().getRecordData(record))
                });  
            

            【讨论】:

              【解决方案13】:

              如上所述,我尝试了以下一个失败。

              store.proxy.reader.jsonData
              

              但下面一个对我有用

              store.proxy.reader.rawData
              

              【讨论】:

                【解决方案14】:

                就我而言,我想要一个 javascript 锯齿状数组,例如[["row1Cell1", "row1cell2"],["row2Cell1", "row2cell2"]] 基于 Ext 网格存储的内容。

                下面的 javascript 将创建这样一个数组,将 id 键放入我不需要的对象中。

                var tableDataArray = [];
                Ext.ComponentQuery.query('[name="table1"]')[0].store.each(function(record){
                    var thisRecordArray = [];
                    for (var key in record.data) {
                        if (key != 'id') {
                            thisRecordArray.push(record.data[key]);
                        }
                    }
                    tableDataArray.push(thisRecordArray);
                });
                

                【讨论】:

                  【解决方案15】:

                  试试这行代码,它对我很有用:

                  var data = (store.getData().getSource() || store.getData()).getRange();
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2019-03-16
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-05-02
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多