翻译 - 【dgrid】Hello dgrid!

原文:Hello dgrid!

dgrid项目由SitePen的工程师所创建,想要创建下一代的栅格组件,可以充分利用现代浏览的优势和在Dojo 1.7中的新功能。它被设计得轻量,模块化,已扩展,且在与Dojo工具集同样的许可下发布的。

获取dgrid

为了开始学习dgrid,你需要先下载它。你可以去dgrid的GitHub仓库下载,然后遵从README中的说明,也可以是用 cpm install dgrid 来自动从Dojo包仓库中获取。

dgrid是第一个独立发布的新Dojo包,而不是作为DojoX命名空间的一部分来发布。这种发布模式是转向Dojo2中发布组件开发的一部分,像GitHub一样改善发布代码服务。

开始

为了使用dgrid,我们需要下载Dojo1.7或更高版本与dgrid的Grid模块:

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title>Tutorial: Hello dgrid!</title>
 6         <script scr="path/to/dojo.js" data-dojo-config="async:true"></script>
 7         <script>
 8             require(["dgrid/Grid", "dojo/domReady!"], function(Grid) {
 9                 var grid = new Grid({/* optinos here */}, "grid");
10                 // ...
11             });
12         </script>
13     </head>
14     <body>
15         <div id="grid"></div>
16     </body>
17 </html>

有了这份代码,为了创建真正有用的grid,我们需要定义两个东西:grid的结构,和我们想要使用的数据。grid的结构应该使用columns选项来定义,有三种定义方法:

1 作为一个带有field和label属性的对象的数组:

 1 var colmuns = [
 2     {
 3         field: "first",
 4         label: "First Name"
 5     },
 6     {
 7         field: "last",
 8         label: "Last Name"
 9     },
10     {
11         field: "age",
12         label: "Age"
13     }
14 ];

2 作为一个哈希表,键作为field使用,值是一个带有label属性的对象:

 1 var columns = {
 2     first: {
 3         label: "First Name"
 4     },
 5     last: {
 6         label: "Last Name"
 7     },
 8     age: {
 9         label: "Age"
10     }
11 };

3 作为一个哈希表,键当作field使用,值当作label使用:

1 var columns = {
2     first: "First Name",
3     last: "Last Name",
4     age: "Age"
5 };

在本教程接下来的部分,我们将使用第三种简洁的方式。

列字段常常需要一些额外的配置项,不只是label,如CSS类,列的格式等等。这样的话就会使用前两种方式。查看Grid文档的specifying grid部分了解更多配置信息。

我们的grid的列结构已经定义了,现在我们需要一些用来是展示的数据。很多高级的grid如onDemandGrid是支持直接使用存储的,比较基础的Grid提供了用于渲染数组数据的renderArray方法。

 1 require(["dgrid/Grid", "dojo/domReady!"], function(Grid) {
 2     var data = [
 3         { first: "Bob", last: "Barker", age: 89 },
 4         { first: "Vanna", last: "White", age: 55 },
 5         { first: "Pat", last: "Sajak", age: 65 }
 6     ];
 7 
 8     var grid = new Grid({
 9         columns: {
10             first: "First Name",
11             last: "Last Name",
12             age: "Age"
13         }
14     }, "grid");
15     
16     grid.renderArray(data);
17 });

我们现在有另一个正常工作的展示javascript数组数据的grid。额外的数据可以通过renderArray方法追加上去;要清除数据,调用refresh方法即可。

我们使用的是基础的Grid模块,在调用renderArray之前是空的。一些如OnDemandGrid这样更高级的基于存储的实现,可以自动的载入存储中的数据。

通过混入,插件和扩展来增加功能

到目前为止,我们创建的grid赤裸裸的啥也干不了。dgrid被设计的很特别,以至于你只“支付”你想要使用的功能,如键盘导航,行或者单元格选择,单元格编辑和列缩放,当你要使用它们的时候要明确的请求它们。

(上面这段原话有点绕,我的理解是,dgrid被设计的比较松散,每个功能点都是单独的,默认情况下是不包含那些如键盘导航,单元格编辑等功能,当需要使用这些功能的时候,需要明确的把这些模块载入进来并使用他们,具体怎么用,且往下看!)

为此,使用dojo/_base/declare声明一个栅格类,并混入所有想要的扩展功能:

 1 require([
 2     "dojo/_base/declare",
 3     "dgrid/Grid", 
 4     "dgrid/Keyboard",
 5     "dgrid/Selection",
 6     "dojo/domReady!"
 7 ], function(declare, Grid, Keyboard, Selection) {
 8 
 9     var CustomGrid = declare([Grid, Keyboard, Selection]),
10 
11     grid = new CustomGrid({
12         columns: {
13             first: "First Name",
14             last: "Last Name",
15             age: "Age"
16         },
17         selectionMode: "single",
18         cellNavigation: false
19     }, "grid"),
20 
21     data = [
22         {first: "Bob", last: "Barker", age: 89},
23         {first: "Vanna", last: "White", age: 55},
24         {first: "Pat", last: "Sajak", age: 65}
25     ];
26 
27     grid.renderArray(data);
28 
29 });

混入了Selection和Keyboard之后,我们有了一个带有键盘导航与行选择功能的grid。然而,当用户与之交互的时候我们没有做任何的处理。可以通过添加事件监听来控制这些。

处理事件

dgrid使用在Dojo 1.7中引入的dojo/on模块来处理事件。grid的事件监听可以通过简单的调用grid.on来实现,由grid的顶层DOM节点接收事件监听。结合事件委派,这中机制可以很容易的给grid中的任何组件添加事件监听,如单元格与行。

除了DOM标准事件,一些grid组件触发他们自己的事件。例如,Selection的混入触发dgrid-select和dgrid-deselect事件。利用这些,我们可以知道用户在与grid交互的时候发生了什么:

1 grid.on("dgrid-select", function(event) {
2     console.log("Row Selected: ", event.rows[0].data);
3 });
4 
5 grid.on("dgrid-deselect", function(event) {
6     console.log("Row de-selected: ", event.rows[0].data);
7 });

使用事件委派,我们可以很容易的监听grid中很多元素的原生DOM事件。

1 grid.on(".dgrid-row:click", function(event) {
2     var row = grid.row(event);
3     console.log("Row clicked: ", row.id);
4 });

为了使用事件委派,你必须确保你载入了dojo/query。把这个模块做成可选的可以帮助保持文件大小减少,当你不想或需要任何事件委派的时候。

现在做什么?

到目前为止,本教程只是瞥了一眼dgrid所提供的功能。在以后的教程中将会深入讨论它所提供的额外的组件,如OnDemandList,可以将你的grid与store相连接。于此同时,查看下dgrid的文档,把你遇到的问题提交到邮件列表中或irc.freenode.net的#dojo频道上,让我们知道你在运行中遇到的问题。

资源

list imagedgrid文档

posted on 2014-11-12 14:39  古道倦马  阅读(614)  评论(0编辑  收藏  举报

导航