`
clue
  • 浏览: 30427 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

ExtJs 4.0 新结构及Buffered Grid实现分析

    博客分类:
  • web
阅读更多
ExtJs 4.0出来也有一段时间了,改动真的很大,说是完整重构了一遍都不为过。这几天为了找思路便专心看源码,总算弄清了点眉目。

整体改动(流水帐,不全)
类继承机制变了,多了mixin、calParent等新的东西,更方便扩展;
Store增加了缓存机制及动态切换分页(range)的接口,可以实现预读及本地快速切换;
类继承关系变了,多了一堆AbstractXXX的类,还没弄懂它们拆分出来的意义;
组件(Component)变了,它自身也有componentLayout了,与Container的Layout区分开;
Panel及其它复杂组件更OO了,例如header也是个Container,含icon、title、spacer、tool等组件,以HBox(或VBox)布局;
Grid的View与旧版的DataView整合了,如今是view.View -> view.Table -> grid.View,其它的各种实现都改了,后面再说。
Tree几乎完全重构,如今也是由Panel, View, Store组合。在3.X中Store只用于存储单维数组,4.0中加了一个TreeStore直接存储树结构,然后tree.View自己又创建一个NodeStore作中介,将TreeStore转换成1维,以方便从view.Table继承而来的View使用。
其它的暂时没有时间精力去研究,有兴趣的可以自己翻源码,一起讨论下4.X的设计思路。

Grid新结构分析
此次主要是为了Buffered Grid而来,想看看它与3.X中的BufferView有何区别,找点实现Buffered Tree的思路。以下便是我的分析:

3.X中Grid主要由4大块组成: Panel, ColumnModel, Store, View,它们是必不可少的。
Panel: 负责主要界面布局
ColumnModel: 定义元数据属性与列的映射
Store: 存储元数据
View: 监听Store,即时更新界面html

4.0初步分析
注:4.0中,Grid(grid.Panel)继承自panel.Table,它实现了Grid的绝大多数功能,而Grid自身的代码不过数十行而已。但panel.Table为私有类,所以这里Grid也泛指panel.Table的逻辑。(tree.Panel也继承自panel.Tabel)
ColumnModel弱化拆分了,不再是个独立的对象,而是用于表头及View的配置;
Scrollbar独立出来,作为一个新的组件,也就是说现在Grid的滚动条不再是原生的,而是JS控制联动的;
新增了features配置,它会在各主要逻辑处作注入执行,方便扩展;
(其它的没细看,主要是分析Buffered功能)

这里的重点就是Scrollbar了,Buffered Grid的实现主要就是依赖它。因为它目前是独立、模拟的,因此可以很方便地在JS联动过程中进行缓存处理。以文字描述一次滚动条移动的处理流程:

1. Scrollbar监测到scroll事件
2. 根据滚动条位置、行高、列表高、元数据总条数等信息,计算出当前位置应该显示哪些条元数据(Record)
3. 调用Store的guaranteeRange方法,传入调整后的元数据范围
4. Store自行切换数据,载入指定范围的元数据,并发出datachanged事件
5. View响应datachanged事件,更新视图

这里的guaranteeRange方法被调用后,Store会尝试从预读缓存中快速载入Record,如果没有,则会从服务器请求。
可以看出,它与3.X的BufferView的实现机制完全不同,一个是Store中数据全在,只不过选择性地渲染;一个是Store进行数据切换,还是全部渲染。
以下是个人对它们的看法
BufferView:
实现更优雅,所有Record都在,只在显示层动手脚,不影响数据层。所以,这种方式仍能使用全选。
4.0 Buffered Grid:
因为Scrollbar是JS联动,可控性更强,滚动非常平滑,不会出现BufferView那样滚动过快会看到短暂的渲染空白。但它实质上是以修改Store中的数据实现的,所以全选不可用(Store中只含部分Record)。

结束
个人感觉4.0的Buffered Grid实现机制并不能让人满意,但整个4.0逻辑结构非常好(赞一个,可惜代码也多了一倍,也更难懂了),所以它的可扩展性比3.0强不少,潜力非凡。据初步分析,BufferView可能可以通过改造view.AbstractView来移植到4.0上,并且这样一来,Tree也能Buffer了  当然,可能只是幻想而已……
并且因为改动过大,所以已经用了3.X的XD们只能YY下了 
分享到:
评论
14 楼 northc 2012-04-19  
楼主  在这里想跟你请教下  Buffered Grid  .  我这里的store的data只能渲染完界面后来通过loadData(somedata)的方式来填充数据     对于Buffered Grid就不起作用了   想请教下有没有什么好的解决办法
13 楼 clue 2011-05-13  
taoge2121 写道
ExtJs的源码看着太费劲了,不如jQ的源码好读!

事情都有两面性,功能强大的自然实现更复杂,上手难度也大
也许以前就有人说,jQ的源码看着太费劲了,不如prototype的源码好读
12 楼 atian25 2011-05-13  
习惯就好吧.
11 楼 taoge2121 2011-05-13  
ExtJs的源码看着太费劲了,不如jQ的源码好读!
10 楼 atian25 2011-05-12  
jlcon 写道
4.0JS体积比原来大了将近一倍,客户端加载更慢了,大家怎么看这个问题?


在4.x里面,你可以轻易的定制你要的类库.
9 楼 clue 2011-05-11  
atomom 写道
强烈建议要支持Bufferview
treegrid的性能完全不行.

为什么不能参造GXT来实现呢.GXT2.0早就实现了bufferview的treegrid了.

这个去官网提比较好,我也提了建议,不过目前没有任何回应

之前研究Ext4.0是为了预研,看看在3.X的项目中能否引入4.0的组件(官方有提供sandbox的示例)
目前个人结论是可行性不高,所以还是转回3.X,尝试借鉴4.0的组件实现开发3.X风格的扩展。

附:
在我们3.X的已有项目中引入4.0可行性不高的原因如下
1. 对3.X做的扩展非常多,引入4.0无法做到平滑嵌入(只扩展了3.X,4.0还是原生的)
2. 两个Ext,就有两套Element机制,会有很多问题(例如对于Ext4创建的组件,使用外部的3.X进行事件释放应该会有问题,因为Ext在注册Dom事件时会记下句柄,以便后面释放。但现在Ext4记下了,Ext3中没有记录)

想象一下,在Ext的Panel中放入YUI的组件   玩笑而已,但尽管它们接口几乎没什么改变,但仍是两套东西。
8 楼 atomom 2011-05-11  
强烈建议要支持Bufferview
treegrid的性能完全不行.

为什么不能参造GXT来实现呢.GXT2.0早就实现了bufferview的treegrid了.
7 楼 clue 2011-05-11  
jlcon 写道
4.0JS体积比原来大了将近一倍,客户端加载更慢了,大家怎么看这个问题?

压缩之后还不如一张图片,以目前的带宽条件来说真没什么

再之,Ext是用于RIA开发的,代码多并不意味着性能低,它只影响一下首次加载时间(并且影响也很小,至于iframe就算了)
RIA网页慢更多的是界面太复杂,导致浏览器渲染布局慢
以一个10000行的列表为例吧,纯html显示也快不到哪里去
如果是用JS动态生成的,那性能一般会更慢,当然是指一次性生成的那种
而在Ext中,可以使用BufferView之类的缓存技术,只生成可视区域的html,再根据滚动条变化即时渲染,这性能提升就很大了。
6 楼 jlcon 2011-05-11  
4.0JS体积比原来大了将近一倍,客户端加载更慢了,大家怎么看这个问题?
5 楼 atian25 2011-05-11  
开始4.0吧, 3.x就算了...
4.0是飞跃
4 楼 646158013 2011-05-10  
3.0 刚学了一部分开始用了。然后4.0出来了。头疼。3.X和之前的2.X的其实改动还不是很大。可是4.0就有些在结构上的变化。还在比较两者去区别。。目前还是坚持用3.0 。4.0还没有用。。
3 楼 clue 2011-05-10  
kyfxbl 写道
那项目从3平滑迁移到4基本就是不可能了啊

可以这样认为,几乎算是全部重写了

用到Ext的项目或多或少都对它做过扩展,或依赖内部结构写了实现
4.0中可能一些大的配置(例如items, layout)还是保留原样,但其它大大小小的改动数不胜数

例如现在store没有recordType了,因为不再使用Record,而是Model
2 楼 kyfxbl 2011-05-10  
那项目从3平滑迁移到4基本就是不可能了啊
1 楼 atian25 2011-05-09  
+U.
最近也在读data和grid这2个包的源码

相关推荐

    EXTJS4.0视频教程配套代码

    [02]EXTJS4.0的新特性.003.zip (14.41M)[02]EXTJS4.0的新特性.002.zip (50.00M)[02]EXTJS4.0的新特性.001.zip 第三讲:extjs4.0数据模型--Model(附件较大做了分包压缩大家只要下载2个包运行001就ok了) [03]EXTJS...

    Extjs 4.0中文版API

    Extjs 4.0中文版API

    extJs4.0 开发手册源码

    EXTJS4.0提供了一系列预定义的组件,如表格、表单、树形结构、图表等,满足各种界面需求。同时,其布局管理器支持多种布局模式,如Fit布局、Form布局、Border布局等,可以灵活地组织和调整组件的位置和大小。 在...

    ExtJs4.0 手册中文版

    `extjs4.0_中文.doc`可能包含ExtJS 4.0的特定技术点或实例解析,如布局管理、图表功能或者动画效果的实现。这份文档可能会帮助开发者更好地理解和应用ExtJS 4.0中的高级特性。 《ExtJS入门教程(超级详细).pdf》则是...

    ExtJs4.0官方版本

    ExtJS 4.0提供了一套丰富的组件库,包括表格、面板、表单、树形结构等,所有组件都可以动态创建和修改。这使得开发者可以构建高度交互和可配置的用户界面。 4. Store管理 Store是ExtJS 4中处理数据的主要对象,它...

    EXTJS4.0视频教程 30集 下载地址

    ### EXTJS 4.0 视频教程 30集 关键知识点解析 #### 一、EXTJS 4.0 概述与安装配置 **1.1 EXTJS 4.0简介** EXTJS 4.0是一款基于JavaScript的开源前端框架,用于构建交互式的Web应用程序。它提供了一套丰富的UI组件...

    extjs4.0帮助文档 extjs-docs-4.0.2.zip

    extjs4.0开发人员以及学习可以下载参考

    免费 Extjs4.0教程视频

    #### 第二讲:Extjs 4.0的新特性 - **新特性概览**: - MVC架构支持,使开发更加模块化、易于维护。 - 性能优化,提高渲染速度和响应性。 - 改进的布局管理器,提供更丰富的布局选项。 - 更强大的数据管理功能,...

    EXTjs4.0学习文档

    EXTJS 4.0 学习文档 EXTJS 4.0 是一个面向开发 RIA 的 AJAX 应用,是一个用 JavaScript 写的,主要用于创建前端用户界面,是一个与后台技术无关的前端 AJAX 框架。它能够帮助我们在页面上快速而简单构建各种各样的...

    ExtJs4.0入门教程

    ExtJs4.0入门教程,详细介绍ExtJs4.0。

    extjs4.0技术

    ### Extjs4.0 技术详解 #### 一、Extjs4.0 概述与获取 **Extjs4.0** 是一款强大的企业级前端框架,它可以帮助开发者快速构建复杂的用户界面,并且提供了丰富的组件和功能。对于初学者来说,理解其核心概念和基础...

    ExtJS4.0开发笔记

    ExtJS4.0开发笔记

    EXTJS4.0视频教程配套代码包含action类

    通过分析和实践这些代码,你可以更深入地理解EXTJS4.0的MVC架构和服务器通信机制。 总的来说,EXTJS4.0的action类是实现客户端和服务器通信的核心工具,学习这部分内容对于开发功能丰富的Web应用至关重要。通过这个...

    ExtJS4.0中文API(chm版和网页版)

    ExtJS4.0中文API chm版:包括ExtJS4,js,jquery 网页版:全面的详细的ExtJS4.0 api

    Extjs4.0基础学习指南

    一款很好的适合Extjs4.0初学者学习的word文档,示例加上简单的标注说明,使你很快对Extjs4.0进入入门阶段,不可多得的文档,值得下载

    Extjs 4.0发布啦

    最新Extjs4.0 所有文件,含案例,帮助文档,源代码

    extjs 4.0 extjs

    标题提到的是ExtJS的4.0版本,这是一个重要的里程碑,因为它引入了许多新功能和改进,与之前的2.0和3.0版本有显著区别。 在ExtJS 4.0中,最显著的变化之一是其模型-视图-控制器(MVC)架构的增强。这个版本提供了更...

    ssh+extjs4.0grid增删改查

    在"ssh+extjs4.0grid增删改查"这个主题中,我们将深入探讨如何将SSH框架与Ext JS 4.0 Grid集成,实现数据的CRUD(Create, Read, Update, Delete)功能。 1. **Struts2整合Hibernate**: - 配置Struts2-Hibernate...

    Extjs4.0开发包

    这个“Extjs4.0开发包”包含了开发人员需要的所有资源,包括库文件、示例和API文档,以便于理解和使用ExtJS 4.0。 首先,让我们深入了解ExtJS的核心概念。ExtJS基于MVC(Model-View-Controller)架构模式,这是一种...

    Extjs4.0中文学习手册、入门详解

    ExtJS 4.0中文学习手册、入门详解 本文为 ExtJS 4.0 的中文学习手册,旨在为初学者提供一个详细的入门指南。本手册涵盖了 ExtJS 4.0 的基础知识、环境搭建、基本使用方法等方面的内容。 1. ExtJS 4.0 的基础知识 ...

Global site tag (gtag.js) - Google Analytics