前言

若干年前,使用Ext JS 3 开发了一个系统。

随着Ext JS 4的出现,总是会看到或听到关于Ext 比较多的言论是 :

Ext JS 4 较Ext JS 3 有较大的改变。

Ext JS 4不向下兼容。

Ext JS 4 开始收费了。

基于这些,对Ext JS 4一直就望而却步。也曾转向使用dojo.

但是对Ext JS 4 的新的平板风格和一些性能上的考量之后,还是决定使用Ext js 4.

在升级结束之际,总结一些主要的改变和应对之策。

创建组件方法 new Ext.XXX ==> Ext.create("",{})

在Ext JS 4之前,创建一个组件的方法是:

var win = new Ext.Window({
//some options
});

在Ext JS 4中, 创建一个组件的方法改变了。 使用Ext.create 的方式。

 var win = Ext.create("Ext.window.Window",{
//some options
});

这中改变,其实是Ext JS 4 改进的一个亮点, 就是支持动态加载了。

在使用旧的方式的时候,相应组件定义的js 文件必须被先include 进来(旧的版本全部包在ext-all.js中), 在新版中可以只导入一些核心的类,其他需要的类使用require 的方式动态导入, 好处就是提高了性能。

当然,在新版中也是支持旧的创建方式的。所以对于升级这件事来说,如果不考虑或者这种类型不考虑动态加载的话, 可以不做更改。

数据模型改变(Ext.data.Record ==> Ext.data.Model)

这个已经完全替换了, 就的方式已经不能work了,必须更改

直接看两个例子就清楚了:

Ext JS 3 的方式:

<!-- add by oscar999 -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="../adapter/ext/ext-base.js"></script>
<script type="text/javascript" src="../ext-all.js"></script>
<link rel="stylesheet" type="text/css" href="../resources/css/ext-all.css"/> <script>
Ext.onReady(function(){
var persons = [{
name: 'Liu Bei',
rank: 'Marshal'
}, {
name: 'Zhang Fei',
rank: 'Admiral'
}, {
name: 'Guan Yu',
rank: 'Admiral'
}, {
name: 'Zhao zilong',
rank: 'Admiral'
}]; var personRecord = Ext.data.Record.create([{
name: 'name'
}, {
name: 'rank'
}]);
var personStore = new Ext.data.Store({
data: persons,
reader: new Ext.data.JsonReader({
id: 'personXX'
}, personRecord)
}); var personGrid = new Ext.grid.GridPanel({
title: 'Three Kingdom',
region: 'center',
margins: '0 5 5 0',
height: 400,
columns: [{
dataIndex: 'name',
header: 'Name',
width: 200
}, {
dataIndex: 'rank',
header: 'Rank',
width: 300
}],
store: personStore,
renderTo: Ext.getBody()
});
});
</script> </head>
<body> </body>
</html>

Ext JS 4的写法

<!-- add by oscar999 -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="../ext-all.js"></script>
<link rel="stylesheet" type="text/css" href="../resources/css/ext-all.css"/> <script>
Ext.onReady(function(){
var persons = [{
name: 'Liu Bei',
rank: 'Marshal'
}, {
name: 'Zhang Fei',
rank: 'Admiral'
}, {
name: 'Guan Yu',
rank: 'Admiral'
}, {
name: 'Zhao zilong',
rank: 'Admiral'
}]; var personModel = Ext.define('Person',
{
extend: 'Ext.data.Model',
fields: [{name: 'name', type: 'string'},{name: 'rank', type: 'string'}]
});
var personStore = Ext.create('Ext.data.Store',{
model: 'Person',
data: persons
}); var personGrid = new Ext.grid.GridPanel({
title: 'Three Kingdom',
region: 'center',
margins: '0 5 5 0',
height: 400,
columns: [{
dataIndex: 'name',
header: 'Name',
width: 200
}, {
dataIndex: 'rank',
header: 'Rank',
width: 300
}],
store: personStore,
renderTo: Ext.getBody()
});
});
</script> </head>
<body> </body>
</html>

注意,为了更清楚的比较,这里只仅仅是让模型和store 的写法不一致(Grid 的定义也要使用Ext.create的方式)。

这里还可以看到一个区别就是Ext JS 4不需要额外导入 ext-base.js

新类型定义(Ext.reg ==> Ext.define)

从Ext.reg 转到Ext.define来创建组件类, 一个好处也是可以实现动态加载JS 类。

而且新的方式会自动完成命名空间的创建(namespace).

旧的方式:

    Ext.ns("Foo.bar");  

    Foo.bar = Ext.extend(Ext.util.Observable,{
//your code here
});
Ext.reg("foobar",Foo.bar);

新的方式:

    Ext.define("Foo.bar",{
extend : "xxxxxx",
alias : "widget.foobar"
//your code here
});

不难理解,为什么可以实现动态记载。一个创建需要的是一个js 对象,而另外一个只是一个string.

Store定义的变化(跨域参数传递)

旧的方式:

    var store = new Ext.data.Store({
        proxy: new Ext.data.ScriptTagProxy({
            url: 'http://extjs.com/forum/topics-remote.php'
        }),
        ......
        baseParams: {limit:20, forumId: 4}
    });

新的方式:

var store = Ext.create('Ext.data.Store', {
model: 'User',
proxy: {
type: 'jsonp',
url : 'http://extjs.com/forum/topics-remote.php',
extraParams: {limit:20, forumId: 4}
}
});

上面介绍的 ”数据模型改变(Ext.data.Record ==> Ext.data.Model) “也是store reader 的定义的变化。

除此之外,上面的例子还有三个不一样的地方:

1. new Ext.XXX ==> Ext.create, 这个上面也介绍到了

2. 跨域取数据的store 定义 (不兼容,需要更新)

旧的方式使用new Ext.data.ScriptTagProxy,新的方式只需要指定proxy的type 为 jsonp 就可以了

3. 参数传递(不兼容,需要更新)

旧的方式是在store 下配置baseParams, 新的方式需要到proxy 下配置extraParams.

applyTo/renderTo 的改变

参考:

[Ext JS 4] contentEL,renderTo, applyTo 释义与区别

[Ext JS 4] contentEL,renderTo, applyTo 释义与区别的更多相关文章

  1. [Ext JS 4] 布局之实战一 - 中间区块不会自动伸展 (tab)

    前言 [Ext JS 4] 布局之实战一 - 中间区块不会自动伸展 (tab) 在上一篇中,中间的tab 区块无法自动伸展的原因一句话说就是: 使用contentEL的方式,相关HTML元素不会参与组 ...

  2. Ext JS 如何动态加载JavaScript创建窗体

    JavaScript不需要编译即可运行,这让JavaScript构建的应用程序可以变得很灵活.我们可以根据需要动态从服务器加载JavaScript脚本来创建和控制UI来与用户交互.下面结合Ext JS ...

  3. [Ext JS 4] 实战之Grid, Tree Gird 添加按钮列

    引言 贴一个grid 的例子先: 有这样一个需求: 1. 给 Grid(or Tree Grid)添加一列, 这一列显示是Button. 点击之后可以对这一行进行一些操作 2. 这一列每一行对应的按钮 ...

  4. 谈谈Ext JS的组件——布局的用法

    概述 在Ext JS中.包括两类布局:组件类布局和容器类布局.由于有些组件是有不同的组件组合而成的,如字段就由标题和输入框构成,他们之间也是存在布局关系的,而这就须要组件类布局来处理组件内自己特有的布 ...

  5. [Ext JS 4] 实战之Grid, Tree Gird编辑Cell

    前言 本篇这里以稍微复杂一点的Tree Grid 来介绍. 在写编辑grid 之, 先来看一下 grid 的 selType 的配置. 先给一个简单的Tree grid 的例子: Ext.onRead ...

  6. Ext JS中Button的一般使用

    Ext JS中Button按钮的显示,以及按钮的部分事件 一.属性 renderTo:将当前对象所生成的HTML对象存放在指定的对象中 text:得到按钮名称 minWidth:按钮最小宽度 hidd ...

  7. [Ext JS 4] Grid 实战之分页功能

    前言 分页功能的实现有两种途径: 一种是服务端分页方式, 也就是web客户端传递页码参数给服务端,服务端根据页面参数返回指定条数的数据.也就是要多少取多少.这种方式比较适合Grid  的数据量很大,需 ...

  8. [Ext JS 4]性能优化

    一般的优化技巧 1. 检查你定义的时间监听器 正确的设置事件监听器对性能会有很大的影响. 举例来说, 在定义一个store的时候,设置一个load 的事件去触发从后台读取数据,如果设置single 的 ...

  9. [Ext JS 4] 实战之 Picker 和 Picker Field

    前言 所谓的picker , 就是弹出一个选择框,让你选择一些信息.比如选择日期, 选择颜色等: 选择的结果总是要放在一个地方的,Picker Field 就是用来放置选择结果的一个文本框. 在Ext ...

随机推荐

  1. springmvc实现long-pulling技术

    背景介绍: 项目中有一个通讯模块,本来是用websocket全双工技术实现的,但IE10下面不支持websocket,而国内的360.2345浏 览器封装的所有是IE10下面的内核,考虑到站点在国内的 ...

  2. Net平台下的消息队列介绍

    Net平台下的消息队列介绍   本系列主要记录最近学习消息队列的一些心得体会,打算形成一个系列文档.开篇主要介绍一下.Net平台下一些主流的消息队列框架.       RabbitMQ:http:// ...

  3. 10. IDENTITY属性使用小结

    原文:10. IDENTITY属性使用小结 从SQL Server 2012开始有了Sequence,简单用列如下: CREATE SEQUENCE TestSeq START INCREMENT ; ...

  4. The Swift Programming Language-官方教程精译Swift(3)基本运算符

    运算符是检查, 改变, 合并值的特殊符号或短语. 例如, 加号 + 把计算两个数的和(如 let i = 1 + 2). 复杂些的运行算包括逻辑与&&(如 if enteredDoor ...

  5. jQuery实现发送验证码倒计时60秒

    前端HMTL: <div class="form_box"> <div class="line mb40"> <div class ...

  6. IOS发展--他们控制的定义

    有没有这样的要求,,自定义panel,里面放几个控件,在多个页面中使用此panel. 有三个观点来解决这个问题: 1.自己继承UIView写一个类,在它是在代码的形式加入需要控制.完成布局. 2.使用 ...

  7. 十六进制颜色与Color对象的互相转换[C#]

    原文:十六进制颜色与Color对象的互相转换[C#] C#十六进制颜色与Color对象的互相转换 把十六进制颜色转化为color对象ColorTranslator.FromHtml("#FF ...

  8. ReSharper C++计划上市

    ReSharper是著名的VS代码生成工具,去年夏天,JetBrains公司就发布了ReSharper将推出支持C++的版本. ReSharper C++ EAP(Early Access Progr ...

  9. android中怎么调整字体的间距和行间距

    在网页中都是很轻松的就可以调整间距的.在android中,我个人并没有去设置过. 下面就来说说android中的间距问题. 原文:http://blog.csdn.net/fancylovejava/ ...

  10. Redis简介与简单安装

    Redis简介与简单安装   一.NoSQL的风生水起 1.1 后Web2.0时代的发展要求 随着互联网Web2.0网站的兴起,传统的关系数据库在应付Web2.0网站,特别是超大规模和高并发的SNS类 ...