Dorado 5 : 4.4.Dataset客户端事件使用详解 (T32)

请参考《Dorado5用户指南》的5.15主要JS事件。
Dataset Client端的事件中,比较容易明白和使用的有beforeInsert、afterInsert、beforeDelete、afterDelete、beforePost、afterPost、beforeCancel、afterCancel、beforeSelectionChange、afterSelectionChange、beforeFlushData、afterFlushData、onCreate、onActive,这些事件在client-api中说明得比较清楚。
我们来重点看一下Dataset除了上面提到的Client端事件之外的事件:

  1. beforeScroll、afterScroll

请参考《Dorado5用户指南》的5.15主要JS事件。
这里想说明一点的是,通过afterScroll事件还可以做到对控件的状态等的控制。比如说在afterScroll事件里控制DataTable的某一行或者某一单元格的只读等等状态。
下面的afterScroll事件代码是控制某一行只读还是可编辑:

var record = dataset.getCurrent();
if(record){
var SEX = record.getValue("SEX");
if(SEX){
if(SEX=="false"){
dataset.setReadOnly(false);
}else{
dataset.setReadOnly(true);
}
}else{
dataset.setReadOnly(true);
}
}else{
dataset.setReadOnly(true);
}

代码 4.5:根据男女来判断每条记录的可编辑性
把代码4.5中的dataset.setReadOnly换成dataset.getField("name"). setReadOnly就可以控制某一单元格的可编辑性等等。

  1. beforeChange、afterChange

请参考《Dorado5用户指南》的5.15主要JS事件。
beforeChange大多数用来做Field的Validators,一般用来验证新值符合条件不。
afterChange一般是用来对某个值改变之后触发其它的事件。

  1. onGetValue、onSetValue

onGetValue是数据集中读取一个数值时触发,返回读到的数值。这个事件可以做一些字符的过滤或者经过处理的值返回。
onSetValue之前触发了beforeChange事件,之后触发了afterChange事件。这三个事件就各自分配了对新值的处理功能。beforeChange对新值做判断,onSetValue对新值在做处理,afterChange对因为新值触发其它事件。
这里要特别注意的是,要考虑一下这些事件里有没有一些代码可以会再触发本身的事件,比如说在beforeChange或者onSetValue或者afterChange(字段field1)中又执行了dataset.setValue("field1",value);这样的话就形成了死循环。一般的解决办法是通过dataset的事件开关disableEvents、enableEvents来处理。

  1. onFilterRecord

当系统过滤记录集时触发,该事件的返回值为true表示当前处理的记录可见,否则该记录将被视为不可见。系统初始化的时候会对该事件执行一次。

dataset的disable和enable

dataset中存在着非常重要的几个开关方法:disableEvents、enableEvents;disableControls、enableControls;disableBanding、enableBanding;disableValidators、enableValidators。
这样开关对于我们做一些功能实现、复杂逻辑、优化性能等等有很多的帮助。请参考client-api中的说明。

手动新增Client端事件

我们在view.xml中没有对某个事件定义逻辑代码,但我们在应用当中又想使用这个事件来触发一下逻辑代码,那我们怎么办呢?我们可以通过EventManager.addDoradoEvent来添加一个Dorado事件的监听器。

EventManager.addDoradoEvent(dataset, "afterScroll", function (dataset) {
var record = dataset.getCurrent();
if(record){
var SEX = record.getValue("SEX");
if(SEX){
if(SEX=="false"){
dataset.setReadOnly(false);
}else{
dataset.setReadOnly(true);
}
}else{
dataset.setReadOnly(true);
}
}else{
dataset.setReadOnly(true);
}
});

代码 4.7:手动给dataset增加一个afterScroll监听器

手动执行Client端事件

我们想在某个事件当中触发其他事件,我们一般通过fireDoradoEvent来执行。比如我想手动执行一次dataset的afterScroll,那我们在代码中写上:fireDoradoEvent(dataset," afterScroll",[dataset]);一般情况下不要使用该方法,因为可以通过在事件中引用function,而外部想执行该事件的内容,直接执行function。

Dataset 执行多个Client端的同一事件

Dataset在客户端也可以想Dataset在服务端的Listener一样进行并列顺序触发事件。
原理跟4.2.2.2一样。
这个对于封装控件和控件的一些逻辑操作时非常有用的。但使用当中一定要注意同一事件的执行顺序,还有各自的互相影响,这些影响一般通过dataset的disable*和enable*来处理。
大概的代码如下:

图 4.2:view.xml对Dataset定义了beforeChange事件

EventManager.addDoradoEvent(datasetCustom, "beforeChange", function (dataset,record,field,value) {
switch (field.getName()) {
case "field1":
alert("field1"+value);
break;
}
});

代码 4.8:手动给Dataset增加多一个beforeChange事件
当触发datasetCustom的beforeChange事件的时候,就先出现alert("value);对话框,之后又出现alert("field1"+value);对话框。