ExtJS 根据商店项目动态创建元素

Posted

技术标签:

【中文标题】ExtJS 根据商店项目动态创建元素【英文标题】:ExtJS create elements dynamically based on store items 【发布时间】:2019-02-12 10:37:02 【问题描述】:

是否可以使用store 属性创建除Ext.panel.Grid 之外的其他一些元素?

例如。假设我有一个面板:

Ext.create('Ext.panel.Panel', 

layout: 'vbox',
scrollable: true,
items: [
    myItemsFunction()
]
));

我从后端得到这个响应:


    "rows": [
    
        "CreateDateTime": "2015-02-09 14:05:46",
        "Name": "de.txt",
        "id": "1"
    ,
    
        "CreateDateTime": "2015-02-09 14:05:46",
        "Name": "en.txt",
        "id": "2"
    ,
    
        "CreateDateTime": "2015-02-09 14:05:46",
        "Name": "it.txt",
        "id": "3"
    ]

我在商店中加载的:

var store_documents = Ext.create('Ext.data.Store', 
    remoteSort: true,
    remoteFilter: true,
    proxy: 
        type: 'ajax',
        api: 
            read: baseURL + '&SubFunc=Documents&Action=view',
        ,
        reader:  type: 'json', rootProperty: 'rows', totalProperty: 'total' 
    ,
    autoLoad: true
);

现在,假设我想要这三个文件(de.txt、en.txt、it.txt)的下载按钮。如何根据商店项目动态创建它们?我想把它放在这个myItemsFunction() 中并在面板项中显示它(代码示例的第一个块)?

或者商店只能与Grid绑定?

【问题讨论】:

【参考方案1】:

您可以使用 ExtJs 存储而不将其绑定到网格,因为 Ext.data.Store 有一个代理,当您调用 store.load() 时它充当 ajax 请求。

所以你可以找到这个工作示例ExtJs Fiddle 基本思想是定义一个新的面板类并使用 initComponent() 函数允许您根据从请求中检索到的数据创建动态项目

app.js

Ext.application(
    name: 'Fiddle',
    launch: function () 
        var storeData = ;
        let store = Ext.create('Ext.data.Store', 
            storeId: 'myStoreId',
            fields: ['id', 'name'],
            proxy: 
                type: 'ajax',
                url: 'app/data.json',
                reader: 
                    type: 'json',
                    rootProperty: 'rows'
                
            
        );
        store.load(function()
            storeData = this.getData().items;
            Ext.create('Fiddle.MyPanel',panelData:storeData);
        );
    
);

app/MyPanel.js

Ext.define('Fiddle.MyPanel', 
    extend: 'Ext.panel.Panel',
    renderTo: Ext.getBody(),
    title: 'Dynamic button creation',
    width: 600,
    height: 300,
    initComponent: function () 
        let panelItems = [];
        //Creating items dynamicly
        for (btn in this.panelData) 
            let me = this;
            panelItems.push(
                Ext.create('Ext.button.Button', 
                    text:me.panelData[btn].data.Name
                )
            );
        
        this.items = panelItems;
        //must call this.callParent()
        this.callParent();
    
)

app/data.json


    "rows": [
    
        "CreateDateTime": "2015-02-09 14:05:46",
        "Name": "de.txt",
        "id": "1"
    ,
    
        "CreateDateTime": "2015-02-09 14:05:46",
        "Name": "en.txt",
        "id": "2"
    ,
    
        "CreateDateTime": "2015-02-09 14:05:46",
        "Name": "it.txt",
        "id": "3"
    ]

【讨论】:

【参考方案2】:

为您的面板定义一个控制器;

为afterrender创建一个事件函数;

在里面,加载你的商店;

将回调参数传递给商店的加载函数,在该函数中迭代加载的数据创建按钮组件;

调用this.getView().add(button) 将按钮添加到面板items 属性

【讨论】:

以上是关于ExtJS 根据商店项目动态创建元素的主要内容,如果未能解决你的问题,请参考以下文章

extjs 动态存储模型网格列

ExtJS 4.1 如何动态创建带有网格的窗口

如何在extjs中动态设置url和root

Extjs 4,如何使用单个 Json 文件为多个动态网格发送多个元数据

如何在 extraParams 商店 extjs 上设置动态值

带有 Ext JS 的 MVC 架构中 store.load() 的动态代理 URL