动态模型,商店和视图 - 最佳方式

时间:2011-09-20 17:29:46

标签: javascript jquery html css extjs

注意:作者是EXT JS的新手,并且正在尝试在他的项目中使用MVC

想象一下,我有一个不修复数据模型的Web服务。我希望动态创建我的模型,从中动态创建存储,从而动态创建其数据存储在这些存储中的组件。

让我们先看一下模型的样本类定义:

Ext.define('MNESIA.model.User', {   
    extend: 'Ext.data.Model' 
});

在这个模型定义中,我在配置对象中遗漏了'fields'参数。这是因为当我创建上述类型的模型的实例时,我想动态地给它提供字段定义,换句话说,我可以拥有该模型的许多实例,但它们都具有不同的'fields'参数定义

从这里我创建了商店的定义,如下所示:

Ext.define('MNESIA.store.Users', {
    extend: 'Ext.data.Store',   
    autoLoad: true  
    }
});

在那里,我有一个商店定义。我遗漏了'model'参数,因为我将动态地将它附加到此类的每个实例。事实上,即使是'data''proxy'设置也没有被提及,因为我想在这个商店的实例化过程中将它们作为对象。

从那里开始,我希望拥有动态视图,由动态商店驱动。下面我有一个Grid的定义

Ext.define('MNESIA.view.Grid' , {
    extend: 'Ext.grid.Panel',   
    alias : 'widget.mygrid',
    width: 700,
    height: 500
});

我在网格规范中遗漏了以下参数:'columns''store''title'。这是因为我打算将许多网格作为上述规范的实例创建,但具有动态存储,标题和列定义。

在我的控制器中,我有一些代码如下所示:

    function() {
        var SomeBigConfig = connect2Server();
        /*
        where: 
            SomeBigConfig = [           
                                {"model":[
                                    {"fields":
                                        ["SurName","FirstName","OtherName"]
                                    }
                                ]
                                },                          
                                {"store":[
                                    {"data":
                                        {"items":[
                                            {"SurName":"Muzaaya","FirstName":"Joshua","OtherName":"Nsubuga"},
                                            {"SurName":"Zziwa","FirstName":"Shamusudeen","OtherName":"Haji"},
                                            ...
                                            ]
                                        }                               
                                    },
                                    {"proxy": {
                                        "type": "memory",                                   
                                        "reader": {
                                            "type": "json",
                                            "root": "items"
                                        }
                                        }
                                    }                               
                                ]
                                },                          
                                {"grid",[
                                            {"title":"Some Dynamic Title From Web Service"},
                                            {"columns": [{
                                                "header": "SurName",
                                                "dataIndex": "SurName",
                                                "flex": 1
                                            },{
                                                "header": "FirstName",
                                                "dataIndex": "FirstName",
                                                "flex": 1
                                            },
                                            {
                                                "header": "OtherName",
                                                "dataIndex": "OtherName",
                                                "flex": 1
                                            }
                                            ]}                          
                                        ]
                                    }
                            ]

        */
        var TheModel = Ext.create('MNESIA.model.User',{
                        fields: SomeBigConfig[0].model[0].fields
                });
        var TheStore = Ext.create('MNESIA.store.Users',{
                        storeId: 'users',
                        model: TheModel,
                        data: SomeBigConfig[1].store[0].data,
                        proxy: SomeBigConfig[1].store[1].proxy
                }); 
        var grid = Ext.create('MNESIA.view.Grid',{          
                        store: TheStore,
                        title: SomeBigConfig[2].grid[0].title,
                        columns: SomeBigConfig[2].grid[1].columns                       
                });

        // From here i draw the grid anywhere on the, page say by

        grid.renderTo = Ext.getBody();
        // end function
        }

现在这种动态创建模型,然后存储,然后网格确实会导致内存浪费,因此每次我们想要销毁该组件时都需要调用每个组件的destroy方法。

的问题:

Qn 1: EXT JS 4的MVC实现是否允许这样做?

Qn 2:如何使用我的新课程xtypes获得相同的功能。比如说:

   {
     xtype: 'mygrid',
     store: TheStore,
     title: SomeBigConfig[2].grid[0].title,
     columns: SomeBigConfig[2].grid[1].columns
   }

Qn 3:如果我上面写的内容确实有效且实用正确,我可以将它应用于所有组件,如Panels,TabPanels,Trees(其中他们的配置是由远程服务器发送的?)

Qn 4:如果我有控制器A和B,控制器A具有视图规范:[C,D],控制器B具有视图:[E,F],它会是如果视图:E生成的操作由控制器A处理,则更正?即控制器是否可以处理未在其视图配置中注册的视图的操作?

注意:我对Ext JS很新,但很想了解更多。建议我如何改进我的EXT JS学习曲线。感谢

1 个答案:

答案 0 :(得分:1)

在我的选项中,你的模型必须映射到要渲染到视图的商店,例如,如果实现像这样的模型部分

 
{"model":[{"fields":[{name:'name',type:'string'},
            {name:'id',type:'string'}]}]}
,这将很容易映射到视图存储渲染它。