码迷,mamicode.com
首页 > 其他好文 > 详细

Ext现在才开始谈基础问题

时间:2014-10-28 15:14:31      阅读:312      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   io   color   os   ar   使用   

1.Ext.get

ext里用来获得element的函数,用途还算广泛,可以通过不少途径获得咱们需要的element,而这个element包括很多有趣的功能。

element跟document.getElementByid(‘mydiv‘)得到的dom对象不一样的,虽然你还可以使用老方法获得指定的id元素,但这样就失去了ext提供的各种常用操作,如动画,定位,css等等。即使使用了ext.get()获得了myDiv,还是可以直接访问document.getElenmentByid(),而且挺简单,还可以直接访问document.getElement()应该得到的部分,ext.get().dom就可以了。

1.1先获得一个element

var myDiv = Ext.get(‘myDiv‘);

你可以在html里看到<div id = ‘myDiv‘>,然后我们用Ext.get(‘myDiv‘)从html里取得这个div,然后封装成element对象,现在这个对象已经存入缓存中了,以后用的时候可以更快。

1.2最吸引眼球的是动画效果

myDiv,addClass(‘red‘);

 2.要是我们想获得一堆元素

2.1选择所有<p>元素

Ext.select("p").highlight();

2.2按照css的class选择

首先我们有几个div,都使用class="red",然后我们让他们都闪一下,调用highlight()。

Ext.selsect("div.red").highlight();

2.3DomHelper和template动态生成html

用dom生成html元素一直是头疼的事情。现在到了ext里面,我们就来看看他自己的实现。

var list = Ext.DomHelper.append(‘parent‘,{tag:‘div‘,cls:‘red‘});

他就是向id=parent这个元素里,添加一个div元素。

按照文档里讲的,第二个参数{}里,除了四个特殊属性以外都会复制给新生成元素的属性,这四个特殊属性是

1.tag 告诉我们要生成一个什么标签,div还是span,诸如此类

2.cls,指的是<div class=‘red‘></div>这种标签中的class属性,因为class 是关键字,正常情况下应该写成className。

3.children,用来指定子节点,它的值是一个数组,里边包含了很多节点。

4.html,对应innerHTML,觉得用children描述太繁琐,直接告诉节点里边的html内容也是一样。

DomHelper除了append还有几个方法,指定将新节点添加到什么位置。

a.插在指定节点后面:

Ext.DomHelper.append(‘parent‘,{tag:‘p‘,cls:‘red‘,html:‘append child‘});

bubuko.com,布布扣

 

b.inserBefore,新节点插在指定节点前面

Ext.Domheper.insertBefore(‘parent‘,{tag:‘p‘,cls:‘red‘,html:‘insert before child‘})

bubuko.com,布布扣

c.insertAfter,新节点插入指点节点后面

d.overwrite,会替换指定节点innerHTML内容。

Ext.DomHelper.overwriter(‘child3‘,{tag:‘p‘,cls:‘red‘,html:‘overwrite child‘})

bubuko.com,布布扣

 

2.4批量生成还是需要Template模板

2.5醍醐灌顶,MasterTemplate和xTemplate

 3.Ext.data命名空间

Ext.data这个namespace下,定义了一系列的store,reader,proxy。grid和comboxBox都是以这个为媒介获取数据的,这个东西好处多多,例如异步加载,类型转换,分页这些功能都包含了,它用这样的形式支持array,json和xml格式的数据,你可以通过memory,http,scriptTag等方式获得,一早这套策略,你要是想实现什么新的协议和数据结构,只要自己拓展reader和proxy就够了。想dwrproxy就实现了自己的proxy和reader,让ext可以直接从dwr获得数据。

3.1proxy系列

3.1.1MemoryProxy

这个MemoryProxy就只能从js对象获得数据,你把一个arry,json或者是xml放到它里头就行了。

var proxy = new Ext.data.MemoryProxy([
      [‘id1‘,‘name1‘,‘descn1‘],
      [‘id2‘,‘name2‘,‘descn2‘]
]);

3.1.2HttpProxy

使用http协议,用ajax去后台取数据的代理,构造它的时候设置一个url:"xxx.jsp",这样他才知道去哪儿找数据。

var proxy = new Ext.data.HttpProxy({url:‘xxx.jsp‘});

后台需要我们对应设计一下了,返回对应的数据

reponse.setContentType("application/x-json");
writer out = response.getWriter();
out.ptint("["+
                     "[‘id1‘,‘name1‘,‘descn1‘]"+
                     "[‘id2‘,‘name2‘,‘descn2‘]"+
 "]");

这个httpProxy是不支持跨域的,它只能从同一个domain下获取数据。

3.1.3scriptTagProxy

这是可以跨域的,但是这个必须在后台进行相关操作。

String cb = request.getParameter(‘callback‘);
response.setContentType(‘text/javascript‘);
Writer out = response.getWriter();
out.write(cb+‘(‘);
out.print("["+
               "[‘id1‘,‘name1‘,‘descn1‘]"+
               "[‘id2‘,‘name2‘,‘descn2‘]"+
              "]");
out.write(");");

奥妙在于,从请求中获得了callback参数,叫做回调函数。

3.2reader系列

读取原始数据库,还要解析一下,把他们变成record,这样才好供给Ext.data.store使用。

3.2.1简单易行的ArrayReader

3.2.2灵活轻便的JsonReader

3.2.3久负盛名的XmlReader

3.3相信你知道怎么做加法

其实不必每次都必须把proxy,reader,store三者全套上阵,实际上你可以选择一些整合方案,看看ext为我们提供了什么?

1.SimpleStore = store +MemoryProxy+ArrayReader

var ds = Ext.data.SimpleStore({
       data:[
                [‘id1‘,‘name1‘,‘descn1‘],
                [‘id1‘,‘name1‘,‘descn1‘]
        ],
       fields:[‘id‘,‘name‘,‘descn‘]
});

2.JsonStore = Store+HttpProxy+JsonReader

var ds = Ext.data.JsonStore({
      url:‘xxx.jsp‘,
      root:‘root‘,
      fields:[‘id‘,‘name‘,‘descn‘]
});

 

4.json

4.1Ext对json的支持力度

4.2反向操作,ext把json变成字符串

4.3说说scope

js中this的使用是由来已久的问题,我只结合具体的例子,告诉你们可能会遇到什么问题。

一个常见的场景是使用ajax回调函数的时候。

我们希望按这个按钮后,使用ajax去后台读取数据,然后把后台响应的数据放到text里。

在此使用Ext.get("text")重新获取对象还比较简单,不过有的情况下很不容易获得需要处理的对象。如何保存ajax之前获得的操作对象呢?

方法一,该ajax设置scope

function doSuccess(response){
        this.dom.value = response.responseText;  
}

Ext.lib.Ajax.request(
        ‘POST‘,
        ‘08-07.txt‘,
        {success:doSuccess,scope:text},
        ‘param‘ + encodeURIComponent(text.dom.value)
);

在ajax的callback参数部分添加一个scope:text,把回调函数的scope指向text,它的作用就是把doSuccess函数里的this指向text对象。好累,再把doSuccess里改成this.dom.value就大功告成了。

方法二:为success添加createDelegate()。

function doSuccess(response){
       this.dom.value = response.responseText;  
}

Ext.lib.Ajax.request(
      ‘POST‘,
      ‘08-07.TXT‘,
      {success:doSuccess,createDelegate(text)},
      ‘param‘ +encodeURIComponent(text.dom.value)
);

createDelegate只能在function上调用,他把函数里的this强行指向我们需要的对象,然后doSuccess里一样用this就可以了。

如果让我选择的话,我会尽量选择scope,因为createDelegate毕竟还是要生成一大堆指向的东西。

 

5.菜单和工具条

6.所谓事件

ext中遵循一种单根的事件模型,只要有哪个控件继承了ext.util.Obserbable,那么它肯定是可以支持事件了。你可以给这个对象定义一系列的事件,再给这些事件配置监听器,到某个事件被触发的时候,会自动去调用对应的监听器,所有这些就是ext的事件模型了。

咱们也继承了Ext.util.Observale,实现一个支持事件对象

Person = function(name){
    this.name = name;
    this.addEvents("walk","eat","sleep");
}

Ext.extend(Person,Ext.util.Observable,{
       info:function(event){
                   return this.name+‘is‘+event+‘ing.‘;
  }
});

这里对象叫做person,有一个属性name,初始化的时候调用this.addEvents()函数定义上三个事件,walk,eat,sleep,最后使用Ext.extend()让Person继承Ext.util.Observable的所有属性,对了,咱们还加上了一个info()函数,让它返回Person的信息。

让我们在html创建一个Person的实例,然后为它的事件都配置好监听器吧。

var person = new Person(‘Lingo‘);
person.on(‘walk‘,function(){
        Ext.Msg.alert(‘event‘,person.name+"走");
});
person.on(‘eat‘,function(){
        Ext.Msg.alert(‘event‘,person.name+"吃"+breakfast+lunch+supper);
});
person.on(‘sleep‘,function(){
        Ext.Msg.alert(‘event‘,person.name+"从"+time.format(‘H‘)+‘点开始睡觉‘);
});

这里on()是addListener()的简写形式,功能完全一样,第一个参数传递事件名,第二个参数是事件发生时执行函数,咱们这里为求简便全写成alert形式。

Ext.get(‘walk‘).on(‘click‘,function(){
       person.fireEvent(‘walk‘);
});

Ext.get(‘eat‘).on(‘click‘,function(){
       person.fireEvent(‘eat‘,‘早餐‘,‘中餐‘,‘晚餐‘);
});

Ext.get(‘sleep‘).on(‘click‘,function(){
       person.fireEvent(‘sleep‘,new Date());
});

好的,调用下fireEvent()就会触发事件了,传入一个事件名作为参数就好,这个时间对应的那些监听函数就去执行。

下面是只有动态语言才能享受到的大优惠,你想给监听方法传递什么参数,直接写到fireEvent()里就行了,不用管参数数量,不用管参数类型,字符串,数字,日期,数组,想传什么就传什么,不过你可要确定监听函数里可以处理你传递过去的参数。

 

正如on是addListener的简写一样,removeListener的简写形式叫做un,可以删除某个事件对应的监听函数。

var fn = function(){};

person.on(‘walk‘,fn);
person.un(‘walk‘,un)

还有一个purgeListeners()函数,可以把所有监听器都删除,注意是所有监听器。

 

Ext现在才开始谈基础问题

标签:des   style   blog   http   io   color   os   ar   使用   

原文地址:http://www.cnblogs.com/romanhzzz/p/4053894.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!