• sencha touch 学习笔记 基本组件1list和panel(2013网页装在兜里)


    记得学习ASP.NET时.NET里面有一大堆组件,从头学到尾,学的吐血,最后发现,有用的组建只有一个repeater和objectdatasourse,sencha touch 和ASP.NET有很多相似的东西,例如统一框架、面向对象、组件化、事件模型等等,所以学习sencha touch时先从最常用最基本的组建list和panel入手,顺便了解他的mvc等东西

    image image

    以读取博客园rss为例来了解list和panel相关的组建

    首先用cmd创建项目,不会创建项目的点 这里

    C:\Documents and Settings\Administrator>e:
    
    E:\>cd "E:\extjs\st"
    
    E:\extjs\st>sencha generate app GS1 ../GS1

    创建好项目后开始修改里面住视图的代码

    image

    生成的视图继承了

     extend: 'Ext.tab.Panel',

    把他修改为我们的panel  panel 的相关api文档:http://docs.sencha.com/touch/2.2.0/#!/api/Ext.Panel

    改为

    extend: 'Ext.Panel',

    然后吧config 里面的属性全部清空,只保留items属性,内容为空

       config: {
      
            items: [
              
                    ]
        }

    items属性是什么意思,开始我也不知道,知道后来看api发现了 http://docs.sencha.com/touch/2.2.0/#!/api/Ext.Panel-cfg-items

    大概意思是用来放子组件的地方例如我们要添加的list组件就可以硬编码到items里面

    list组件的 xtype 为:list

     config: {
    
            items: [
                {
                    id:'feedlist',
                    xtype:'list',
                    itemTpl:'html模板'
                }
    
                    ]
        }

    list组件和asp.net里面的repeater组件一样,都是用来展示集合类数据的,对与每一个实体展示为html时,用js模板去展示,这个属性就是itemTpl,

    sencha touch js模板很强大 api http://docs.sencha.com/touch/2.2.0/#!/api/Ext.XTemplate

    在 ASP.NET 里面repeater用objectdatasourse作为数据源,

    在sencha touch  里面 list 可以用store 作为自己的数据源,什么是store api:http://docs.sencha.com/touch/2.2.0/#!/api/Ext.data.Store

    因为sencha touch 支持mvc,根据我的理解,一个model的集合就是store model api http://docs.sencha.com/touch/2.2.0/#!/api/Ext.data.Model

    我们要读取博客园的rss,博客园的rss是xml的在phonegap里面只能跨域读取json的数据,所以得用谷歌的rssapi

    https://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=15&q=http://feed.cnblogs.com/blog/sitehome/rss

    首先我们根据 rss创建一个model

    Ext.define('GS2.model.feedlist', {
        extend: 'Ext.data.Model',//创建model要继承Ext.data.Model
        //store:'GS2.view.feedlist',//关联呆会我们要创建的store
        config: {
            fields: [//定义的模型包含哪些字段
                { name: 'id', type: 'int' },
                { name: 'title', type: 'string' },
                { name: 'summary', type: 'string' },
                { name: 'published', type: 'string' },
                { name: 'author', type: 'string' },
                { name: 'link', type: 'string' },
                { name: 'blogapp', type: 'string' },
                { name: 'diggs', type: 'string' },
                { name: 'views', type: 'string' },
                { name: 'comments', type: 'string' }
    
            ]
    
        }
    });

    在模型里面支持这几种数据类型

    image

    然后在创建一个store作为刚才创建model的集合

     
    Ext.define('GS2.store.feedlist', {
        extend: 'Ext.data.Store',
     
        config: {
            model: 'GS2.model.feedlist',//关联的model
            storeId:'mystore',//每一个store都要有一个storeId 方便查找和使用
          //  fields: ['title', 'link', 'author', 'contentSnippet', 'content', {
          //      name: 'leaf',
          //      defaultValue: true
         //   }],
            //有事后服务器端返回的数据结构比较复杂,直接在这里定义一级节点比定义复杂的model方便些
            autoLoad:true,//在实例化的时候是否载入数据,
          //  root: {
          //      leaf: false
          //  },
            proxy:{
                type: "jsonp",
                url : "https://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=15&q=http://feed.cnblogs.com/blog/picked/rss/",
     
                reader: {
                    type: 'json',
                    rootProperty: 'responseData.feed.entries'
                }
            }
        }
     
    });

    定义好store后,就可以在view里面和list关联起来使用,就像asp.net里面repeater绑定一样

    在view里面使用store和list关联起来的方法有常见的两种

    1 直接创建并使用,例如在initialize 视图初始化里面

     initialize:function(){
            console.log(Ext.getStore('mystore'));
            var list=  {
                xtype:'list',
                //store:Ext.getStore('mystore'),//mystore 是可以的
                store:Ext.create('GS2.store.feedlist'),
                itemTpl:'1<div class="tweet"><span class="posted">{title}</span><h2>{author}</h2></div>',
                id:'blogclasslist',
                flex:1
            };
            this.add(list);
        }

    2 系统启动时初始化store,用的时候查找药用的store

    系统启动时初始化store和model,在app.js 里面

     requires: [
            'Ext.MessageBox',
            'Ext.TitleBar',
            'Ext.dataview.List',
            'Ext.data.proxy.JsonP',
            'GS2.model.feedlist',
            'GS2.store.feedlist'
        ],
     
        models:[
            'GS2.model.feedlist'
        ],
        stores:[
            'GS2.store.feedlist'
        ],
        views: [
            'Main'
        ],

    requires 明确要依赖那些类,但是并不是实例化这些

    下面的models 会实例化相关的model,stores 会实例化相关的stores,然后在view里面和list关联起来,这里有很隐秘的BUG,被坑了1天

    2.1 在config的items里面配置,

      config: {
            layout:'vbox',
            items: [
                {
                    docked: 'top',
                    xtype: 'titlebar'
                },{
                    xtype:'list',
                    store:'mystore',//Ext.getStore('mystore') 是不可以的
                    //注意这里必须是store的id
                    itemTpl:'2<div class="tweet"><span class="posted">{title}</span><h2>{author}</h2></div>',
                    id:'2blogclasslist',//组件的id方便上下文查找这个list
                    flex:2
     
                }
                    ]
        }

    2.2 在initialize 里面动态的添加组件,我比较喜欢这种方式

     initialize:function(){
            console.log(Ext.getStore('mystore'));
            var list=  {
                xtype:'list',
                store:Ext.getStore('mystore'),//mystore 是可以的
                //store:Ext.create('GS2.store.feedlist'),
                itemTpl:'1<div class="tweet"><span class="posted">{title}</span><h2>{author}</h2></div>',
                id:'blogclasslist',
                flex:1
            };
            this.add(list);
        }

    这样就简单的把list和store绑定了,store里面的数据改变了,和他绑定的list展示的内容也就变了

    对与store中的每一个model都是用itemTpl 的模板展示出来 语法很简单 每个字段用{}括起来就好了

    复杂的 if for 等 api:http://docs.sencha.com/touch/2.2.0/#!/api/Ext.XTemplate

    对与 list 最基本的操作就是点击一个list触发的事件了

    list 还有两个非常常用的事件,当然,其他事件也很有用

    单击事件 和选择时间

    首先是单击事件

            var list=  {
                xtype:'list',
                store:Ext.getStore('mystore'),//mystore 是可以的
                //store:Ext.create('GS2.store.feedlist'),
                itemTpl:'1<div class="tweet"><span class="posted">{title}</span><h2>{author}</h2></div>',
                id:'blogclasslist',
                flex:1,
                listeners:{
                    itemtap:function( obj, index, target, record, e, eOpts ){
                        //点击事件
                        // 这几个参数也比较有用
                        //index 当前单击的 序号 可以根据序号在store中查找数据
                        //target 具体单击的是那个元素,有时候需要精确到那个按钮
                        //record 当前单击的包含的数据 就是store中的一个model
                        alert('点击事件');
                    }
                }
            };

    然后是选择事件

    {
                    xtype:'list',
                    store:'mystore',//Ext.getStore('mystore') 是不可以的
                    //注意这里必须是store的id
                    itemTpl:'2<div class="tweet"><span class="posted">{title}</span><h2>{author}</h2></div>',
                    id:'2blogclasslist',
                    flex:2,
                    listeners:{
                        select:function( obj,  record, e, eOpts ){
                            //选择事件
                            alert('选择事件');
                        }
                    }
    
                }
  • 相关阅读:
    set使用
    css盒子模型详解一
    列表页调用当前栏目的子类织梦标签
    织梦如何在导航栏下拉菜单中调用当前栏目子类
    HDU1812
    BZOJ1485: [HNOI2009]有趣的数列
    组合数学学习笔记
    Full_of_Boys训练2总结
    Full_of_Boys训练1总结
    FFT算法学习笔记
  • 原文地址:https://www.cnblogs.com/qqloving/p/3078538.html
Copyright © 2020-2023  润新知