Dorado 5 : 5.18.主要JS事件 (RF1)

数据集的光标移动事件

Dataset拥有当前记录的概念,当前记录也就是我们所说的数据集的光标,当数据集的光标从一条记录切换到另一条记录时,系统得光标就会发生变化,也就是说当程序调用数据集的moveNext(),movePre(),moveFirst();moveLast();insertRecord(); deleteRecord()等方法导致记录指针的位置发生改变时,便会触发该事件,该事件一般用于应用中多个dataset之间的同步,例如常见的主从/明细表例子。光标移动的事件有两个:
afterScroll:光标移动之后触发的事件,例如不通过MasterLink技术实现明细页面效果,可以在主dataset的afterScroll中:

var params = datasetEmployee.parameters();
params().setValue("dept_id", dataset.getValue("dept_id"));
datasetEmployee.flushData();

以上代码中,将主dataset的部门编号取出,并作为员工表的dept_id参数传入,由员工表datasetEmployee负责接受和处理dept_id,并调用flushData()重新执行查询。这样我们就可以实现如下的效果:

图表 68
在上图中,当我们切换主表的当前记录时,下方的员工表格会保持同步。效果演示地址:

http://61.151.239.187/dorado5/new-feature/new-dataset.jsp

beforeScroll:光标移动之前触发的事件,通常情况下可在此处返回一个AbortException用以拒绝光标的移动。在dataset的Events Inspector面板中选中beforeScroll事件,双击打开事件编辑器,并输入如下的范例代码:

return new AbortException();

这样系统执行时,将会拒绝记录的光标移动动作。

数据集的记录修改事件

当数据集中的当前记录被修改时,会触发记录的修改事件。例如在程序中通过dataset或record的setValue方法修改某一个字段的值,或通过与dataset绑定的数据感知组件修改dataset中的内部数据后都会触发记录修改事件。使用该事件进行有关的处理是很有用的。在一个具体的应用程序中,字段的值是经常会被修改的,监控字段值的修改对我们来说经常是很有意义的。例如在合同维护界面中,产品单价以及产品数量的修改我们都需要重新记录产品总价。
在dataset的Events Inspector面板中,找到dataset的afterChange事件,并双击打开事件编辑器,在其中加入如下的代码:

switch (field.getName()) {
case "num":;
case "price":;
case "cost": {
calcItem(record);
break;
}
}

以上代码中判断如果修改的字段为数量(num),价格(price),成本(cost).就调用自定义的calcItem(record)函数,重新计算合计值。calcItem函数定义如下:

// 计算单条记录中的金额,毛利..
function calcItem(record) {
var num = record.getValue("num");
var sum = record.getValue("price") * num;
var cost_sum = record.getValue("cost") * num;
record.setValue("sum", sum);
record.setValue("cost_sum", cost_sum);
record.setValue("profit", sum - cost_sum);
record.post();
}

该范例的演示效果可以参考如下的地址:

http://61.151.239.187/dorado5/training/ui/contract-maintain.jsp?contract_no=SC060511&op=edit&

另外记录的修改事件中还提供了beforeChange事件,一般情况下我们都是使用beforeChange事件进行数据校验,例如控制单价的值不能超过10000,则可以在dataset的beforeChange事件中加入代码:

switch (field.getName()) {
case "price": {
if (value>10000) return new DoradoException("薪水必须小于10000元");
break;
}
}

以上的代码中判断如果当前记录修改事件中修改的是price字段,并且判断函数参数传入的value值,该值为用户的输入值,作为参数被传递到beforeChange事件中,我们将这个值与10000比较,如果大于10000就抛出一个DoradoException,并加入系统提示信息。告诉用户如何更正自己的输入。

数据集的记录删除事件

当从dataset中删除当前记录时会触发记录删除事件。通常都是通过dataset的deleteRecord()方法实现数据删除动作,或通过数据导航条的删除按钮以及datatable提供的删除快捷键操作都会触发记录的删除事件。
如希望禁止删除动作,可以在dataset的Events Inspector面板选中beforeDelete事件,并双击打开事件编辑器,并输入如下代码:

return new AbortException();

如想在禁止删除动作的同时,提供提示信息警告用户,则可以将代码换为:

return new DoradoException("当前记录不允许删除!");

另外一个与记录删除有关的事件是afterDelete,该事件是beforeDelete事件中未禁止删除动作,并且当前记录已经被删除之后触发。通常用于应用中与其他界面组件的同步操作。

数据集的记录新增事件

当向当前dataset添加一条新记录时,会触发该种事件。通常都是通过dataset的inertRecord()方法实现记录新增动作,或通过数据导航条的新增按钮以及datatable提供的新增记录快捷键操作都会触发记录的新增事件。
如希望禁止记录新增动作,可以在dataset的Events Inspector面板选中beforeInsert事件,并双击打开事件编辑器,并输入如下代码:

return new AbortException();

如想在禁止新增记录动作的同时,提供提示信息警告用户,则可以将代码换为:

return new DoradoException("不允许添加新记录!");

另外一个与记录新增有关的事件是afterInsert,该事件是beforeInsert事件中未禁止记录新增动作,并且dataset已经添加了一条空记录之后触发。通常用于应用中该记录的初始化工作。例如设定其中几个字段的默认值,可以在dataset的Events Inspector面板中双击afterInsert事件,在事件编辑器中输入:

dataset.setValue("sex",true);
dataset.setValue("married", false);
dataset.setValue("dept_id", "D11");

以上代码设定新增的空记录中的sex字段为true,married字段为true,dept_id字段为D11。