【问题标题】:ExtJS — How to load store data manually after ajax call?ExtJS — 如何在 ajax 调用后手动加载存储数据?
【发布时间】:2018-04-21 11:27:04
【问题描述】:

我将工作中的 Fiddleajax 代理类型重写为 memory。我正在尝试手动加载memory 存储数据:

// app/model/Employees.js file
Ext.define('Fiddle.model.Employees', {
    extend: 'Ext.data.Model',
    entityName: 'Employees',

    fields: [
        {
            name: 'profile_pic'
        },
        {
            type: 'int',
            name: 'age'
        },
        {
            type: 'string',
            name: 'last',
            mapping: 'name.last'
        },
        {
            type: 'string',
            name: 'first',
            mapping: 'name.first'

        },
        {
            type: 'string',
            name: 'email'
        }
    ],

    proxy: {
        type: 'memory',
        reader: {
            type: 'json',
            rootProperty: 'items',
            totalProperty: 'total',
            successProperty: ''
        }
    }
});

// app/store/Employees.js file
Ext.define('Fiddle.store.Employees', {
    extend: 'Ext.data.Store',
    pageSize: 30, // items per page
    alias: 'store.employees',
    model: 'Fiddle.model.Employees',
});

//app.js fule - launch() function
var store = Ext.create('Fiddle.store.Employees');
console.log(store);


Ext.Ajax.request({
    url: 'mates.json',
    success: function(resp) {
        var result = resp.responseText;
        console.log(result);
        // store.loadRawData(result);
        store.loadData(result);
        console.log(store);
        console.log(store.getAt(0));
    },
});

因此,我的 json 文件中的每个符号都存储了 3386 条记录。我在控制台中看到的第一条记录:

我做错了什么?

我需要在哪里放置proxy 行 - 在模型中还是在商店中?

【问题讨论】:

    标签: extjs store extjs6


    【解决方案1】:

    responseText 是一个字符串,包含序列化的 JSON 数据。您必须先将其反序列化为对象,然后才能使用loadRawData 通过模型转换器将对象加载到存储中:

    var result = Ext.decode(resp.responseText);
    store.loadRawData(result);
    

    loadDataloadRawData 的不同之处在于loadData 不调用模型上的转换器。 loadRawData 相当于 ajax 代理所做的,loadData 不是。

    【讨论】:

    • 感谢您的解释。我做了一点不同,请参阅我自己的答案。但我不知道我是否为这件事正确选择了网格事件 =)
    【解决方案2】:

    是这样做的:

    //in Grid panel js file
    listeners: {
        afterrender: function(grid, evt) {
    
            var myStore = grid.getStore();
    
            Ext.Ajax.request({
                url: 'mates.json',
                success: function(resp) {
                    var result = Ext.decode(resp.responseText);
                    myStore.getProxy().data = result;
                    myStore.load();
                },
            });
    
        }
    }
    

    必须禁用店内autoLoad: true。这种加载方式而不是store.loadRawData(result); 显示了pagingtoolbar 中正确的记录数。

    【讨论】:

    • 你为什么要这样做?只需让商店通过 ajax 加载数据。
    • @EvanTrimboli 我需要从 json 文件中读取一次数据(无写入操作),所以我使用 memory 类型并使用 Ajax 手动加载数据。
    • 这只是让它变得更加困难。在 store 上设置 ajax 代理并自动加载。
    • 牵强附会:这是一个 XY 问题。 @Sogl 正在组合框上搜索 queryMode: 'local'...
    猜你喜欢
    • 1970-01-01
    • 2013-08-25
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 2015-05-30
    • 2014-02-05
    • 2014-09-16
    • 2016-12-01
    相关资源
    最近更新 更多