ext数据源->store

ext中大多数数据的来源是直接从数据源中取得的,我在些项目的时候combo(下拉框)用的尤其多,包括下拉框的联动问题都是基于数据源的变化来得到的。

数据源的创建:

数据源的创建现在只知道两种方式:

第一种:

            var dsPro = new Ext.data.Store({

            proxy: new Ext.data.HttpProxy({

                method: 'post',

                url:""

            }),

            reader: new Ext.data.JsonReader({

                root: 'rows',

                totalProperty: 'total',    

                fields: ['id','text']  

            })     

       });

 第二种:

var gameds = Ext.extend(Ext.data.Store,{

            proxy: new Ext.data.HttpProxy({

                method: 'post',

             url:" "

            }),

            reader: new Ext.data.JsonReader({

                root: 'rows',

                totalProperty: 'total',    

                fields: ['gameId','gameName']  

            })

       });

var form_gameds = new gameds();

区别:第一种直接

new 一个数据源赋值给所需变量,使用的时候可以直接使用。

第二种不能直接使用,使用的时候重新设置变量,然后new它。

个人感觉第一种的数据干扰性比较强,不知道是什么具体的原因,像好多combo(下拉框)在使用同一个名字的数据源(虽然有时候都不在一个js文件夹中)的时候,数据竟然会干扰,在另一个combo中选择了相应的值,在另一个combo中不选择也默认选择的相同的值,隐藏的值会被赋值,到现在都不知道为什么。而且下拉的数据联动也有问题,即:有时候选择了显示的值,但是隐藏值没有!!十分坑爹。在另一个数据源使用这个隐藏值作为参数进行加载的时候,就没有参数值了,参数值为空,结果这个数据源就肆无忌惮的加载,有时会把数据库里所有的数据都刨根问底的刨出来。联动效果显示的乱七八糟,直到我直到了第二种设计数据源的方法,就再没有出现过这种情况。原因还是归结为数据干扰的问题吧!

 

数据源中有两个很重要的属性,必不可少的,proxyreaderproxy是根据用new Ext.data.HttpProxy({})来生成,Ext.data.HttpProxy({})这个还不太了解proxy是根据其中的url来获取原始的数据,然后通过reader把原始数据转换成record实例,后放入store中,至此store创建完毕。

Store.load()方法来实现上述的转换过程,如果没有load()这个方法的执行,上面的数据源是不进行加载的,除非在创建数据源的时候加上另一个属性autoloadtrue,这样在数据源进行创建时久自行加载,在可以使用数据源的时候数据源就会有数据,如果不加autoload属性,默认为false,那么在之后使用数据源的时候只能进行自行加载,否则数据源里是没有数据的。

 

Proxy中的url所对应的方法,返回的数据要对应下面reader的读取数据类型,这里即是JSON型的,JSON只会用一点,具体不太了解。

    有时候我们会用到fields里面的数据因为参数的变化可能会进行变化,在我第一次写代码的时候,首先想到的是在数据源进行load的时候重新设计reader,即reader重新读取得来的原始数据,把reader中的fields属性用变量代替,然后通过变化这个变量来改变reader,其实我觉得到现在这里都是可行的(没有试验过),但是现在还是不能游离的把某一个数据源的reader来调用到,改变数据源的reader必须在load之前(好像是废话,但是开始学的时候废了好大力气)。最后我的解决办法:按照这个变量的名字重新new一个出来,也就是根据创建store的时候才能重新设计reader

    利用数据源进行combo(下拉框的联动),上面已有说过部分,这里在系统写下,以便日后自己都不知道自己做了什么!

    原理:每一个combo都有自己的数据源,联动只不过是解决了在选第一个数据的时候,选择的数据对下一个数据源造成了特定的影响,从而使第二个数据源的数据有了限制!

    PS:这里还得说下combo怎么去跟数据源关联。具体看combo的介绍(之后再总结)。先简单说下,必须要由以下几个属性:store:数据源名字,displayField显示的值’,valueField:’隐藏值mode加载数据源方式’,typeAhead:true,

triggerAction: 'all',这些跟数据源有关的属性基本就这些了。设置好!

    在选择第一个combo值得时候也就是进行select的时候对他影响的combo所加载的数据源进行加参数,加载!

                   listeners:{

                   select:{

                               fn:function(combo,record,index) { 
                                    Ext.getCmp('server').clearValue();//清空combo为server中的显示

                        form_serverds.removeAll();//清空当中的数据源数据

                        form_serverds.load({

                                                  params:{areaId:Ext.get('form_areaId').dom.value}

                                                   });//对影响的数据源加参数进行加载

                         }

                            }

                   }

 Listeners

combo 的一个属性,监听是否有 select 事件,有的时候进行触发。懂了很简单 当时头都大两圈。

你可能感兴趣的:(ext,combo,store)