Learning EXT 翻译(十一)
- 格式:doc
- 大小:167.00 KB
- 文档页数:11
第五章 使用grid显示数据(3)
利用PHP从数据库加载数据:
GridPanel的设置保持不变。和从静态文件中读取JSON数据不同的是,我们需要利用PHP来从数据库中获取数据,然后格式化为Ext可以读懂的JSON:
// connect to database
$sql = "SELECT * FROM movies";
$arr = array();
If (!$rs = mysql_query($sql)) {
Echo '{success:false}';
}else{
while($obj = mysql_fetch_object($rs)){
$arr[] = $obj;
}
Echo '{success:true,rows:'.json_encode($arr).'}';
}
?>
N:这里的PHP代码的旨在用最简单的语句来完成任务。在真正的产品中,你可能要考虑SQL注入攻击、错误监测和用户验证——本例的代码并没有设计这么多。
编写grid:
之前我们的代码都着眼于如何让grid显示内容,但是我们经常会要求grid能够对用户的输入做相应。一种最常用的交互方式就是选中或者移动一行或者几行数据。ExtJS引用了这些交互,用selection model(选择模型)来处理它。让我们来看看如何建立这个selection model。 处理单元格和行的选择:
Ext的grid提供了监听用户和表格的行、单元格以及列交互事件的工具,那就是selection model(选择模型)。selection model用来决定行、列或者单元格怎样被选中以及允许多少项可以被同时选中。它允许我们为选择事件添加一些listener,同时给我们提供了一种查询选择行的方法。
列出一些selection model:
CellSelectionModel:让用户只能选择单一的单元格;
RowSelectionModel:让用户选择完整的行;
ColumnSelectionModel:让用户选择完整的列;
CheckBoxSelectionModel:让用户使用checkbox(复选框)来做行的选择;
我们需要根据自己项目的需求来选择selection model,对于我们的电影数据,我们需要使用row selection model,这是一种最普遍的selection model。
在GridPanel中使用cm配置项来定义selection model。
sm: new Ext.grid.RowSelectionModel({
singleSelect: true
})
我们还需要让singleSelect配置项为true,这样就可以阻止用户同时选择多行。
监听selection model的选择事件:
listener(监听器)可以在任何地方引入,完全取决于需要的交互。开始,我们将listener放在column model中,因为我们需要监听列的动作。
但在这里,我们将listener加在selection model中,因为我们想知道用户在什么时间选择了一个电影。
sm: new Ext.grid.RowSelectionModel({
singleSelect: true,
listeners: {
rowselect: { fn: function(sm,index,record) {
.Msg.alert('You Selected',record.data.title);
}
}
}
})
选择一列会弹出一个alert提示框,让我们看看到底发生了什么:
我们为rowselect事件建立了一个listener,它用来等待行被选中,从而执行相应的函数;
向function传递selection model,选中行的序号(第一行为0),以及选中行的数据记录;
利用function中接收的数据记录来获取电影的题目然后在信息框中显示。
用代码操控grid(以及它的数据):
操控grid和它的数据的函数有很多,可以绑定到其他的Ext控件上来完美地满足很多功能需求。
在点击按钮时改变grid:
这里,我们准备添加一个顶部工具栏,它将包含一个按钮来弹出提示窗口,用来编辑电影的标题。 tbar: [{
text: 'Change Title',
handler: function(){
var sm = grid.getSelectionModel();
if (sm.hasSelection()){
var sel = sm.getSelected();
Ext.Msg.show({
title: 'Change Title',
prompt: true,
buttons: Ext.MessageBox.OKCANCEL,
value: sel.data.title,
fn: function(btn,text){
if (btn == 'ok'){
sel.set('title', text);
}
}
});
}
}
}]
我们只需要改变data store即可。服务器上的数据库还是保持不变的,服务器也不知道到底有改变没有。我们的任务就是通过AJAX请求或者其它方式来让服务器得知数据的改变。
让我们快速地看下这里发生了什么:
sm:从grid中获得的selection model;
sel:利用selection model来获得被选中的行;
sel.data:使用被选中项的数据对象,我们可以获得它的数据。
这个基本的方法可以用来建立很多有趣的用户交互,我们唯一的限制就是一天只有24小时,并且我们还需要睡觉。(作者够幽默)
高级grid格式化:
因为我们都想建立一些用户与grid之间的交互,那就让我们先添加更多的按钮来做更好玩的事情。
这里有一个可以添加到工具栏上的按钮,它能偶让我们隐藏以及显示列。我们还可以基于列的可见与否动态改变按钮上的文字。
{
text: 'Hide Price',
handler: function(btn){
var cm = grid.getColumnModel();
var pi = cm.getIndexById('price'); if (cm.isHidden(pi)){
cm.setHidden(pi,false);
btn.setText('Hide Price');
}else{
cm.setHidden(pi,true);
btn.setText('Show Price');
}
btn.render();
}
}
我们使用了一个新的方法——getIndexById,你可以想象——获得列的序号(从0到比列总数少1),它可以被用来得知一个列和其它列的关系。在我们的grid代码中,price列是第四列,所以他的index(序号)是3,因为是从0开始计数的。