最棒的Angular2表格控件


Posted in Javascript onAugust 10, 2016

现在市面上有大量的JavaScript数据表格控件,包括开源的第三方的和自产自销的。可以说Wijmo的Flexgrid是目前适应Angular 2的最好的表格控件。 

Angular 2数据表格基本要求: 更小、更快、更熟悉。

最棒的Angular2表格控件 

为了使用Angular 2表格,首先你需要了解表格的基本要求。FlexGrid开始于1996年,当时使用C++为Visual Basic编写的控件。多年来,它不断进化并在多个平台得到完善,尤其是JavaScript平台。FlexGrid 因为Flex的理念而命名,控件应当包含最需要的关键功能集和可扩展的能力。内置的基本功能比如:排序、分组、编辑,同时其他比较花哨的东西可以通过可选的扩展来提供。这将会保持控件的精简和高效,同时给了客户深度自定制的能力。 

另外一个重要的指标就是性能。FlexGrid不断和其它产品比较,以确保我们足够快。Flex理念使得我们的文件足够小(压缩后约25K),我们对其它的框架没有任何依赖。最显著的性能改进是通过虚拟渲染。FlexGrid虚拟化全部的DOM,每次只绘制需要填充视区的单元格(和一些为使滚动平滑的缓冲区)。当表格滚动,单元格(DOM元素)会被回收。虚拟渲染意味着Grid可以在1秒内绑定百万级的数据。 

最后,最重要的特点之一就是熟悉的操作。FlexGrid基于Excel所有的交互行为,这可能是用户最常用的操作Grid的方式了。人们希望在滚动,点击,尤其是使用键盘命令(包括剪切板函数)时得到确定的行为,而不是我们自己发明的。我们模仿了Excel,因此用户在使用我们的表格时会感觉很舒畅,令人惊奇的是,许多其它的Grid发明了它们自己的行为或者不完全支持滚动和键盘行为。比如当你选择一行数据并按住向下箭头,许多表格并不会表现出你预想的行为。 

使用标记语言来声明UI控件 

现在,我们来看看在FlexGrid在AngularJS下的优势。在AngularJS下最大的好处就是FlexGrid的标记语言:Angular组件提供了使用标记语言来声明控件的能力。声明标记很好地遵循了MVVM设计模式,我们可以完全通过View(标记语言)来配置我们的组件。 

FlexGrid支持使用Angular标记语言来声明完整的API。你完全可以使用标记语言设置属性,附加事件,配置子组件(比如列)。 

下面是一个例子,演示了怎样使用Angular2标记语言来配置FlexGrid。 

<wj-flex-grid [itemsSource]="data"> 
  <wj-flex-grid-column [header]="'Country'" [binding]="'country'" [width]="'*'"></wj-flex-grid-column> 
  <wj-flex-grid-column [header]="'Date'" [binding]="'date'"></wj-flex-grid-column> 
  <wj-flex-grid-column [header]="'Revenue'" [binding]="'amount'" [format]="'n0'"></wj-flex-grid-column> 
  <wj-flex-grid-column [header]="'Active'" [binding]="'active'"></wj-flex-grid-column> 
 </wj-flex-grid>

下面是我们已声明的标记语言得到的结果。 

最棒的Angular2表格控件

许多其他的Grid组件仅提供了使用标记语言声明一个控件的能力,这导致所有的配置都必须使用JavaScript(ViewModel)完成。这使View和ViewMode之间混乱不清,迫使开发者必须使用JavaScript来改变控件UI。当这么做您将错失Angular 绑定的所有好处。我们认为这么做是一种反模式。看下面的不同:

<ag-grid-ng2 #agGrid style="width: 100%; height: 350px;" 
 // items bound to properties on the controller
 [gridOptions]="gridOptions"
 [columnDefs]="columnDefs">
</ag-grid-ng2>

通过使用完全支持标记语言的组件,你可以得到完全的MVVM模式支持,像其他开发平台(ASP.NET, Java, Silverlight, Flex)一样构建应用程序。 

申明可复用的单元格类型模板
为了使用标记语言声明任何FlexGrid成员,我们也提供了单元格模板。单元格模板是为不同类型的单元格声明可复用模板的一种方式。单元格模板支持任何有效的Angular标记,包含绑定表达式,html和其他组件。单元格模板类型包括:标题单元格,编辑模式单元格,普通模式单元格等等。 

通过单元格模板,FlexGrid提供了一个用于创建组件的表现方式。您不仅可以使用标记语言申明FlexGrid,还可以在每一个单元格中使用所有的Angular语法。让我们看看FlexGrid单元格模板标记是多么强大。 

<wj-flex-grid [itemsSource]="data1"
 [allowSorting]="false"
 [deferResizing]="true">
 <template wjFlexGridCellTemplate [cellType]="'TopLeft'" *ngIf="customTopLeft">
   №
 </template>
 <template wjFlexGridCellTemplate [cellType]="'RowHeader'" *ngIf="customRowHeader" #cell="cell">
   { {cell.row.index}}
 </template>
 <wj-flex-grid-column header="Country"
  binding="country"
  width="*">
  <template wjFlexGridCellTemplate [cellType]="'Cell'" *ngIf="customCell" #item="item">
    <img src="resources/{ {item.country}}.png" />
    { {item.country}}
  </template>
  <template wjFlexGridCellTemplate [cellType]="'GroupHeader'" *ngIf="customGroupHeader" #item="item" #cell="cell">
    <input type="checkbox" [(ngModel)]="cell.row.isCollapsed" />
    { {item.name}} ({ {item.items.length}} items)
  </template>
 </wj-flex-grid-column>
 <wj-flex-grid-column header="Downloads"
  binding="downloads"
  [width]="170"
  [aggregate]="'Sum'">
  <template wjFlexGridCellTemplate [cellType]="'ColumnHeader'" *ngIf="customColumnHeader">
    <input type="checkbox" [(ngModel)]="uiCtx.highlightDownloads" />
   Downloads
  </template>
  <template wjFlexGridCellTemplate [cellType]="'Cell'" *ngIf="customCell" #item="item">
    <span [ngStyle]="{color: uiCtx.highlightDownloads? (item.downloads>10000 ?'green':'red'):''}"
    style="font-weight:700">
     { {item.downloads}}
    </span>
  </template>
  <template wjFlexGridCellTemplate [cellType]="'Group'" *ngIf="customGroup" #cell="cell">
   Sum = { {cell.value | number:'1.0-0'}}
  </template>
 </wj-flex-grid-column>
</wj-flex-grid>

我们声明的单元格模板得到的结果 

最棒的Angular2表格控件

 Angular2中可复用的单元格模板 

再次强调,为了在其他表格控件中实现这种效果,你需要编辑JavaScript文件,并ViewModel中编写。

使用数据绑定自动更新控件。 

我相信Angular最具生产力的好处是绑定表达式,这允许我们创建的控件可以自动地响应数据更改,使我们从繁琐的事件处理程序和DOM操作中解放出来。 

FlexGrid所有的属性都支持数据绑定,另外,我们还为一些需要双向数据绑定的属性提供双向绑定。不需要编写任何代码,您就可以绑定组件以处理事件和与Model交互数据。 

数据绑定在任何的开发平台(Java,.NET)都是一等公民,Angular使它变得更加容易,并且同时支持单向和双向数据绑定。 

TypeScript:与Angular 2天作之合。 

FlexGrid和所有的Wijmo控件都使用TypeScript编写。我们在Microsoft平台工作有相当长的一段历史了,所以当TypeScript变得成熟时,我们有一种家的感觉。TypeScript给了我们一种类似于编写C# 的体验:类,继承,强类型,类型检查,构建时错误检查等等。它是我们创建企业级JavaScript控件的催化剂,就像我们在其它平台所做的,我们无需在API或语法中做任何的妥协。 

也许最重要的而是,TypeScript 为我们提供了创建真正的控件而不是小部件的能力。FlexGrid作为一个类继承自我们的基本控件类。当小部件强迫你使用令人尴尬的函数去设置一个属性和传值时,FlexGrid却有getter 和setter 访问器,你可以直接设置他们。Wijmo也包含一个用于简单添加处理程序的事件模型。 

如果我们的用户选择使用TpyeScript来开发时,将会在支持的IDE中获得智能提示、警告,当他们尝试分配为一个属性分配不正确的类型时有错误信息。 

TypeScript最吸引人的特点就是我们的客户可以继承并扩展我们的控件,这符合我们的Flex理念,简化了控件自定制并减少错误。 

最后,我们与Angular2齐头并进。很惊喜地看到几年前我们做出的一个决定,采用了微软的语言。我们的控件类已经采用TypeScript,因此可以和Angular2无缝结合。我们简单地扩展了它们并添加了元数据用来在Angular2组件中暴露它们。 

不要听信我的一面之词:您也试试 

“我们购买了Wijmo,他们的团队做了一个伟大的工作:界面美观;深思熟虑的架构;完善的文档;跟进不断变化的技术。”思科公司的BJ Jeong说。 

如果我的文字没有说服你,鼓励你去尝试FlexGrid,证明我的对错。如果我错了并且FlexGrid被别的Grid控件打败,你可以告诉我。20年来我们从没有停止发展和提高,我们永远也不会停止。立即下载进行体验。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript function、指针及内置对象
Feb 19 Javascript
添加JavaScript重载函数的辅助方法2
Jul 04 Javascript
JQuery学习笔录 简单的JQuery
Apr 09 Javascript
javascript中Date对象的getDay方法使用指南
Dec 22 Javascript
javascript中几个容易混淆的概念总结
Apr 14 Javascript
一道JS前端闭包面试题解析
Dec 25 Javascript
学习JavaScript设计模式之观察者模式
Apr 22 Javascript
使用vue-cli编写vue插件的方法
Feb 26 Javascript
基于Axios 常用的请求方法别名(详解)
Mar 13 Javascript
node.js使用fs读取文件出错的解决方案
Oct 23 Javascript
解决vuecli3中img src 的引入问题
Aug 04 Javascript
Vuex实现简单购物车
Jan 10 Vue.js
浅谈js中的三种继承方式及其优缺点
Aug 10 #Javascript
jQuery+HTML5+CSS3制作支持响应式布局时间轴插件
Aug 10 #Javascript
基于js中的原型、继承的一些想法
Aug 10 #Javascript
新入门node.js必须要知道的概念(必看篇)
Aug 10 #Javascript
jQuery制作圣诞主题页面 更像是爱情影集
Aug 10 #Javascript
jquery实现拖动效果
Aug 10 #Javascript
JS弹出新窗口被拦截的解决方法
Aug 09 #Javascript
You might like
PHP访问Google Search API的方法
2015/03/05 PHP
详解HTTP Cookie状态管理机制
2016/01/14 PHP
PHP使用XMLWriter读写xml文件操作详解
2018/07/31 PHP
jQuery 常见学习网站与参考书
2009/11/09 Javascript
JS判断不同分辨率调用不同的CSS样式文件实现思路及测试代码
2013/01/23 Javascript
Knockout text绑定DOM的使用方法
2013/11/15 Javascript
jQuery插件开发详细教程
2014/06/06 Javascript
jquery数组过滤筛选方法grep()简介
2014/06/06 Javascript
浅析javascript中函数声明和函数表达式的区别
2015/02/15 Javascript
AngularJS学习笔记之TodoMVC的分析
2015/02/22 Javascript
ubuntu下安装nodejs以及升级的办法
2015/05/08 NodeJs
浅谈Sticky组件的改进实现
2016/03/22 Javascript
ES6通过babel转码使用webpack使用import关键字
2016/12/13 Javascript
详解AngularJS验证、过滤器、指令
2017/01/04 Javascript
jQuery制作全屏宽度固定高度轮播图(实例讲解)
2017/07/08 jQuery
深入理解Vue 单向数据流的原理
2017/11/09 Javascript
javaScript和jQuery自动加载简单代码实现方法
2017/11/24 jQuery
js断点调试经验分享
2017/12/08 Javascript
微信小程序云开发实现数据添加、查询和分页
2019/05/17 Javascript
jquery UI实现autocomplete在获取焦点时得到显示列表功能示例
2019/06/04 jQuery
什么时候不能在 Node.js 中使用 Lock Files
2019/06/24 Javascript
新手快速入门微信小程序组件库 iView Weapp
2019/06/24 Javascript
pytorch 实现删除tensor中的指定行列
2020/01/13 Python
flask框架url与重定向操作实例详解
2020/01/25 Python
解决python ThreadPoolExecutor 线程池中的异常捕获问题
2020/04/08 Python
Python实现Kerberos用户的增删改查操作
2020/12/14 Python
.NET remoting中对象激活的两种方式
2015/06/08 面试题
请用Java实现列出某个目录下的所有文件
2013/09/23 面试题
医学毕业生自我鉴定
2013/10/30 职场文书
《都江堰》教学反思
2014/02/07 职场文书
《世界多美呀》教学反思
2014/03/02 职场文书
《新型玻璃》教学反思
2014/04/13 职场文书
校园安全标语
2014/06/07 职场文书
食堂管理制度范本
2015/08/04 职场文书
python实现简单的聊天小程序
2021/07/07 Python
WCG2010 星际争霸决赛 Flash vs Goojila 1 星际经典比赛回顾
2022/04/01 星际争霸