zoukankan      html  css  js  c++  java
  • ext--创建store

      如何通讯?通过ajax,获取到的数据如何管理?大多数时候我会认为,完全没有必要,通过ajax获取数据以后,整个流程就已经结束了...

      在基础数据维护或者大多数后台管理系统中,登陆的目的就是为了增删改,单独用ajax时,对于数据的修改,依赖于额外引入的一个变量'data'或者将其置入一个容器form,通过form.submit自动获取所需要修改的数据...另一种更为oo的方式就是在提出一层,该层管理缓存数据与平台数据,在ext中,这就是store

      以下内容基于extjs5

    意义

      两年前我喜欢'扁平化代码',总的来说就是减少分层,后台的三层架构给改成两层,前端的ext的store就直接使用ajax代替或者使用一个自定义的通用类(其功能类似且小与store),好听点叫,接收的业务简单,不需要那么多的分层,提高笑率(没错,是笑),难听点就是完全不懂其分层的意义

      store, 仓库,对客户端缓存的封装,用于存储model对象,可以通过proxy进行数据的增删改,也可以配合各种自带工具,进行前端的个性化查询

    The Store class encapsulates a client side cache of Model objects. Stores load data via a Proxy, and also provide functions for sorting, filtering and querying the model instances contained within it.

     so,需要理解model与proxy

    创建

    根据描述store是模型的数据的封装,so,只要有模型的描述和data的描述就对了,大致是这个样子(参考官网demo)

    Ext.create('Ext.data.Store', {
        fields: [
             {name: 'firstName', type: 'string'},
             {name: 'lastName',  type: 'string'},
             {name: 'age',       type: 'int'},
             {name: 'eyeColor',  type: 'string'}
         ],
        data : [
             {firstName: 'Ed',    lastName: 'Spencer'},
             {firstName: 'Tommy', lastName: 'Maintz'},
             {firstName: 'Aaron', lastName: 'Conran'},
             {firstName: 'Jamie', lastName: 'Avins'}
         ]
    });

    验证,先使用grid进行验证,而后在通过方法的方式,第一个栗子大致是这样的

    Ext.onReady(function() {
    
    var store=Ext.create('Ext.data.Store', {
        fields: [
             {name: 'firstName', type: 'string'},
             {name: 'lastName',  type: 'string'},
             {name: 'age',       type: 'int'},
             {name: 'eyeColor',  type: 'string'}
         ],
        data : [
             {firstName: 'Ed',    lastName: 'Spencer'},
             {firstName: 'Tommy', lastName: 'Maintz'},
             {firstName: 'Aaron', lastName: 'Conran'},
             {firstName: 'Jamie', lastName: 'Avins'}
         ]
    });
    
    Ext.create('Ext.grid.Panel', {
        title: 'Simpsons',
        store: store,
        columns: [
            { text: 'firstName',  dataIndex: 'firstName' },
            { text: 'lastName', dataIndex: 'lastName'},
            { text: 'age', dataIndex: 'age' },
            {text: 'eyeColor', dataIndex: 'eyeColor' }
        ],
        height: 200,
         400,
        renderTo: Ext.getBody()
    });
    
    });

    从这个栗子上看到定义了两次fields,第一次用以描述model(数据),第二次用以描述columns(渲染),这是我最喜欢吐槽的地方,不够扁平化-.-先无视吐槽,这里已经可以发现store就是以往的data,so,先看看fields

    fields

    代替model的参数, fields值应该是一个Ext.data.Field属性对象的集合. store对象将 自动使用此参数的值来创建一个Ext.data.Model数据模型. 通常应该避免使用此参数, 它只是为了向下兼容而存在. 对于任何稍复杂的情况, 比如制定一个特定的ID或关联关系, 都应该定义一个Ext.data.Model模型对象并通过 model参数指定给当前store.

    This may be used in place of specifying a model configuration. The fields should be a set of Ext.data.Field configuration objects. The store will automatically create a Ext.data.Model with these fields. In general this configuration option should only be used for simple stores like a two-field store of ComboBox. For anything more complicated, such as specifying a particular id property or associations, a Ext.data.Model should be defined and specified for the model config.

    官方推荐使用model,store会使用这个参数自动产生模型以做对应,如果缺少model,它可以为[](空缺的描述默认为string),但不能同时空缺,总之一句话,store依赖model对象,so,要想先创建store,最好先创建model

    model

    创建model以替代fields,修改部分如下:

    Ext.define('User', {
         extend: 'Ext.data.Model',
         fields: [
             {name: 'firstName', type: 'string'},
             {name: 'lastName',  type: 'string'},
             {name: 'age',       type: 'int'},
             {name: 'eyeColor',  type: 'string'}
         ]
     });
    
    var store=Ext.create('Ext.data.Store', {
        model:'User',
        data : [
             {firstName: 'Ed',    lastName: 'Spencer',    age: 'Spencer',    eyeColor: 'Spencer'},
             {firstName: 'Tommy', lastName: 'Maintz'},
             {firstName: 'Aaron', lastName: 'Conran'},
             {firstName: 'Jamie', lastName: 'Avins'}
         ]
    });

    常见model类,删除store下的fields属性,新增model,并添加模型名称,此时,作为仓库,模型/模板/结构已经建立好了,接下来需要管理数据,data肯定是数据的填充,但并不包含数据的管理

    proxy

    proxy对增删改查进行了封装,包含两部分Client/Server,其中server根据传输的方式/协议分ajax,jsonp,rest,direct,使用每一传输的场景,又有诸多的配置,这就是proxy,举个例子

     var proxy=Ext.create('Ext.data.proxy.Ajax',//最常用的ajax,也可以选择jsonp
        {
             url: 'api/user/users',//请求地址
             reader: {
                 type: 'json',//返回json对象,至少还有xml,至少res中的Content-Type:application/json还需要对应
                 root: 'users'//返回对象的根key,json对象的传输,并需是{},不能是[]
             }
         })
    var operation = proxy.createOperation('read');
    proxy.read(operation);

    Operation:用于仓库和代理之间的通信。应用程序开发者应该尽可能少地 直接与Operation对象交互。

    operation是对参数的封装,比如分页,过滤,排序,通过创建proxy就可以与后台进行交互了,虽然叫做ajax但并不像标准的ajax一样需要自定义回调,proxy的回调在reader中进行描述,最重要的是,它还可以通过描述api参数,对不同的操作进行不同的请求,proxy也是对ajax的进一步封装(换句话说,他们的关系大致是:通过proxy关联模型与api进行ajax封装,通过store保存数据,增加过滤,排序等功能封装,单可以通过继承的方式proxy继承store的模型,so,用起来也就像是store封装ajax了-.-)

    基于少用Operation的原则,和一个store一般一个proxy,并不会复用的业务,一般描述一个store也就变成了这个样子:

    //模型描述
     Ext.define('User', {
         extend: 'Ext.data.Model',
         fields: [
             {name: 'firstName', type: 'string'},
             {name: 'lastName',  type: 'string'},
             {name: 'age',       type: 'int'},
             {name: 'eyeColor',  type: 'string'}
         ]
     });
    
    //仓库整合
    Ext.define('UserStore', {
        extend:'Ext.data.Store',
         autoLoad: true,
         model: "User",
         ////链接描述
         proxy: {
            type:'ajax',
             url: 'api/user/users',//请求地址
             reader: {
                 type: 'json',//返回json对象,至少还有xml,至少res中的Content-Type:application/json还需要对应
                 root: 'users'//返回对象的根key,json对象的传输,并需是{},不能是[]
             }
         }
     });

    而后根据ext的框架结构, 讲不同的描述防治不同的目录下,万事就ok了

  • 相关阅读:
    如何解决UITextField挡住键盘的问题
    设置UITextField中能输入的最大的字数
    如何判断IOS的设备版本型号
    IOS中如何实现对话聊天
    精美的iOS图片欣赏
    关于IOS 应用图标的设置
    ios7中添加多个按钮
    elementary0.4:快速配置工具
    elementary:网易云音乐白条解决
    deepin下eclipse快捷方式
  • 原文地址:https://www.cnblogs.com/liuCy/p/4939095.html
Copyright © 2011-2022 走看看