dorado事件
//----------------------------------------------------------------------------//
//校验实体数据是否填写
if(entity.validate()!="ok"){
return;
}
//----------------------------------------------------------------------------//
/**
*在鼠标失去焦点候将填写的小写字母转换为大写字母
*/
//@Bind #pcode.onBlur
!function(self, arg){
var str = view.get("#dsMain").getData("#.pcode");
var uperStr = str.toUpperCase();
view.get("#dsMain").getData("#").set("pcode", uperStr);
//如果有长度限制则自动截取前面一个
var str = view.get("#dsQueryCriteria").getData("#.qu");
if(str != null){
var uperStr = str.substring(0,1).toUpperCase();
view.get("#dsQueryCriteria").getData("#").set("qu", uperStr);
}
};
//----------------------------------------------------------------------------//
//校验数据时使用自定义校验
if ('' != arg.data) {
//判断座机格式的
var partten = /^(\d{3,4}\-)?\d{7,8}$/i; //座机格式是 010-98909899
//var partten = /^0(([1-9]\d)|([3-9]\d{2}))\d{8}$/; 没有中间那段 -的 座机格式是 01098909899
var zuoji=partten.test(arg.data);
//判断手机格式可以用
var re = /^(\\+86)?(1[0-9]{10})$/;
var shouji=re.test(arg.data);
if(zuoji || shouji){
//throw new dorado.Exception("输入联系方式正确");
}else{
throw new dorado.Exception("你输入的电话号码有误!")
return;
}
}
//----------------------------------------------------------------------------//
/**
* DATATYPE数据改变时触发事件
*/
//@Bind @VT04ProductM.onDataChange
!function(self, arg){
//将小写转换为大写
// var str = view.get("#dsMain").getData("#.pcode");
// var uperStr = str.toUpperCase();
// view.get("#dsMain").getData("#").set("pcode", uperStr);
if (arg.property == "pcode") {
if (arg.oldValue != arg.newValue) {
view.get("#isExistPcode").set("parameter",arg.newValue);
console.log(arg.oldValue,"旧值");
console.log(arg.newValue,"新值");
view.get("#isExistPcode").execute(function(message){
if (null != message) {
dorado.MessageBox.alert(message);
if(null == arg.oldValue || '' == arg.oldValue || undefined == arg.oldValue){
view.get("#dsMain").getData("#").set("pcode", '');
return;
}else{
view.get("#dsMain").getData("#").set("pcode", arg.oldValue);
return;
}
}
});
}
}
};
//----------------------------------------------------------------------------//
/**
* DATATYPE数据改变时触发事件
*/
//@Bind @VT04Color.onDataChange
!function(self, arg){
if (arg.property == "colorcode") {
alert(arg.oldValue);
if (arg.oldValue != arg.newValue && undefined != arg.oldValue) {
view.get("#isModify").set("parameter",arg.oldValue);
//判断修改时颜色编码在系统中是否已使用(已使用则不允许修改)
view.get("#isModify").execute(function(message){
if (null != message) {
dorado.MessageBox.alert(message);
if(null == arg.oldValue || '' == arg.oldValue || undefined == arg.oldValue){
view.get("#dsMain").getData("#").cancel();
}else{
view.get("#dsMain").getData("#").cancel();
}
}
});
}
}
};
//----------------------------------------------------------------------------//
//弹出dialog
//@Bind #btnAdd.onClick
!function(self, arg) {
view.get("#dsMain").insert();
view.get("#dlgMainAdd").show();
};
//----------------------------------------------------------------------------//
/**
* DataGrid中的触发器传值
*/
//@Bind #dsddUser2.onValueSelect
!function(self, arg) {
var employeeid = view.get("#dsUser").getData("#").get("EMPLOYEEID");
view.get("#dsMain").getData("#").set({
"userid" : employeeid
});
};
//----------------------------------------------------------------------------//
/**
* 以下是页面基本的事件
*/
// @Bind #dsQueryCriteria.onReady
!function(self, arg) {
view.get("#dsQueryCriteria").insert();
};
// @Bind #btnQuery.onClick
!function(self, arg) {
var queryParm = view.get("#dsQueryCriteria").getData("#");
view.get("#dsMain").set("parameter", queryParm).flushAsync();
};
//@Bind #btnReset.onClick
!function(self, arg) {
view.get("#dsQueryCriteria").getData("#").cancel();
view.get("#dsQueryCriteria").fireEvent("onReady");
};
//----------------------------------------------------------------------------//
//控制工具栏按钮的可用性
function enableTlbBtn(propType, a, b,c,d,e) {
view.id('btnOrderConfirm').set(propType, a);
view.id('btnYgbPre').set(propType, b);
view.id('btnYgbConfirm').set(propType, c);
view.id('btnSybApprove').set(propType, d);
view.id('btnSybReject').set(propType, e);
}
//@Bind view.onReady
!function(self, arg){
var pageFlag = '${param.flag}';
if (pageFlag == null || pageFlag == '') {
enableTlbBtn("visible",false,false,true,false,false);
}else if(pageFlag == 1){
enableTlbBtn("visible",false,true,false,false,false);
}else if(pageFlag == 2){
enableTlbBtn("visible",false,false,true,false,false);
}else if(pageFlag == 3){
enableTlbBtn("visible",false,false,false,true,true);
}else if(pageFlag == 4){
enableTlbBtn("visible",false,false,false,false,false);
}else if(pageFlag == 5){
enableTlbBtn("visible",false,false,false,false,false);
}
};
//----------------------------------------------------------------------------//
强大的&&和||表达式
你可能在JavaScript库和JavaScript框架中已经见过它们了, 那么我们先由几个基本的例子开始:
Example 1:|| (或)
设置默认值,通常用:
function setKey(value){
if(!value){
value = "Default Value";
}
}
用这个代替:
function setKey(value){
value = value || "Default Value";
}
!提示: JavaScript判断为假的值: null,false,0, undefined, NaN 和 ""(空字符串).
记住像Infinity(无限大)这种 Number(感谢@xyzhanjiang 的指正) 的值是被判断为真不是假.
而NaN则被判断为假. 除了以上这些, 其他值全部被判断为真.
解析:
- || 操作符首先从左开始判断表达式的真假, 如果为真, 马上返回左边表达式返回的值;
如果左边表达式被判断为假, 则继续判断右边的表达式, 并返回右边表达式的值.
- 如果value被判断为假, 会返回右边表达式的值.
换句话说, 如果value变量被判断为真, 则返回value的值.
//----------------------------------------------------------------------------//
Example 2:&&(并)
不要这么做:
function isAdult(age){
if(age && age > 17){
return true;
}else{
return false;
}
}
用这个代替:
function isAdult(age){
return age && age > 17;
}
解析:
- && 操作符从左开始判断表达式, 如果左边的表达式被判断为假,
则返回false(!注:如果左边表达式的值为0时,则返回0感谢@飞天鼠 的指正), 不管右边的表达式是否为真.
- 如果左边的表达式为真, 则继续判断右边的表达式, 然后返回右边表达式结果
//----------------------------------------------------------------------------//
Dorado数据校验器--正则表达式
表达式
说明
/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)/g
IP
/^(\\+86)?(1[0-9]{10})$/
手机
[\u4e00-\u9fa5]
中文
\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*
邮件
^[-]?[0-9]+[\\.]?[0-9]+$
数字
http://([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?
网址
//----------------------------------------------------------------------------//
/**
* 保存按钮
*/
//@Bind #btnSaveAdd.onClick
!function(self, arg) {
// if(entity.validate() != "ok"){
// return;
// }
var entity = view.get("#dsMain").getData("#");
//判断修改时车辆型号在车籍表中是否存在和该车辆型号是否已维护价格
if (2 == entity.state) {
alert(entity.get("hidepcode"));
if(entity.get("hidepcode") != entity.get("pcode")){
var hidePcode = entity.get("hidepcode");
view.get("#isModify").set("parameter",hidePcode);
view.get("#isModify").execute(function(message) {
if(null != message){
dorado.MessageBox.alert(message);
return ;
}
});
}
}
};
//@Bind #isModify.onSuccess
!function(self, arg){
if(null == arg.result){
view.get("#updateSave").execute(function(message) {
if(message == '执行成功!'){
dorado.MessageBox.alert(message);
view.get("#dlgMainAdd").hide();
view.get("#dsMain").flushAsync();
}else{
if('新增时车辆型号在系统中重复!' == message){
view.get("#dsMain").getData("#").setState(1);
dorado.MessageBox.alert("车辆型号在系统中存在重复!");
}else if('修改时时车辆型号在系统中重复!' == message){
dorado.MessageBox.alert(message);
}else{
dorado.MessageBox.alert(message);
}
}
});
}
};
//----------------------------------------------------------------------------//
/**
* 仓库文本框的回车事件(回车后根据数据编码查询)
*/
//@Bind #sourceck.onKeyDown
!function(self, arg){
if(arg.keyCode == '13'){
console.log("selfValue",self.get("value"));
if(null != self.get("value") && '' != self.get("value")){
view.get("#queryCk").set("parameter", self.get("value")).execute(function(listMap) {
if(listMap.length == 1){
var ckname = listMap[0].NAME;
view.get("#dsQueryCriteria").getData("#").set({
"ckname" : ckname
});
}else{
dorado.MessageBox.alert("仓库编码无效,请重新输入!");
}
});
}else{
dorado.MessageBox.alert("仓库编码无效,请重新输入!");
}
}
};
//----------------------------------------------------------------------------//
创建dom
var s = new dorado.widget.Dialog({
id: "dlgMsg",
caption: " 提示", // 定义标题
width: "350",
height: "150",
"modal": false,
center: true,
icon: "url(>skin>common/icons.gif) -140px -100px",
"children": [
{
$type:"Label",
height: "30"
},
{
$type:"Label",
width: "320",
height: "20",
text: "仓库编码无效,请重新输入!",
}],
});
//----------------------------------------------------------------------------//
set添加数据
this.get("#dsProduct").getData().insert();
或者this.get("#dsProduct").insert();
this.get("#dsProduct.data").insert();推荐使用
“#dsProduct.data”表示拿到数据对象
2.删除当前选择记录
var record = this.get("#dsProduct.data:#");
if (record) {
dorado.MessageBox.confirm("确认要删除当前记录吗?", function(){
record.remove();
});
}
else {
dorado.MessageBox.alert("当前没有数据可以删除!");
}
//获得当前dataset的字段,并赋值(dorado7升级包,特别注意)
var pkVipCustomer = view.get("#dsVipCustomer.data:#").get("PK_COO_CRM_VIPCUSTOMER");
view.get("#dsVipCustomerCoop").set("parameter",{
pkVipCustomer: pkVipCustomer,
org:"test"
});
//含有下级Reference
view.get("#dsPrCenter").getData("#").getData("#stmain");
view.get("#dsPrCenter").getData("#.#stmain");
3.dataset放弃当前操作数据
this.get("#dsProduct.data:#").cancel();
//----------------------------------------------------------------------------//
dorado.MessageBox.show({
icon: "WARNING",
title: "自定义个的标题",
message: "这是一个自定义的对话框",
buttons: ["yes", "no", "cancel"],
closeAction: "cancel",
detailCallback: function(button, text) {
dorado.widget.NotifyTipManager.notify("您选择了\"" + button + "\"。");
}
});
//----------------------------------------------------------------------------//
dorado.Core.setTimeout(s, function() {this.XXX;}, 2000);
//----------------------------------------------------------------------------//
自定义通知消息是指,我们可以通过notify方法对通知消息提示框做更多的特性设定,如本例通过一个JSON对象定制NotifyTip的特性:
dorado.widget.NotifyTipManager.notify({
text : "消息提示.....",
caption : "<重要通知>",
icon : "INFO",
autoHide : false,
listener : {
onHide : {
fn : function() {
tip = null;
self.set("disabled", false);
}
}
}
});
上述代码将
提示信息通过text设定
caption修改为"重要通知"(默认为"系统通知")
通过icon属性自定义提示信息的图标
autoHide设置为false,禁止通知消息自动关闭
通知消息提示框关闭后按钮才变得可操作
关于notify更多的自定义方法请通过Client-API的dorado.widget.NotifyTipManager.notify查看。
//----------------------------------------------------------------------------//
非阻塞式的指示器在任务执行的过程中还可以继续做页面操作。
非阻塞式的指示器用法比较简单,大致代码为:
dorado.util.TaskIndicator.showTaskIndicator("测试非阻塞任务指示器");
dorado.widget.NotifyTipManager.notify("通知信息");
另外对与任务指示器,我们还需要记得去关闭它,如本例:
var taskId = dorado.util.TaskIndicator.showTaskIndicator("测试后台任务" + taskNo);
setTimeout(function() {
dorado.util.TaskIndicator.hideTaskIndicator(taskId);
}, 3000);
上面的代码首先通过showTaskIndicator方法返回的任务指示器的taskId,并调用利用timeout,在3秒钟后调用hideTaskIndicator方法隐藏创建的任务只是器。
//----------------------------------------------------------------------------//
与非阻塞式任务指示器不一样的是,在执行阻塞式的任务指示器的时候,指示信息始终在页面中居中显示,另外我们还可以注意到阻塞式的任务指示器执行的时候,页面无法继续操作,知道阻塞式的任务指示器任务执行完毕才可以。
其基本用法与非阻塞式的指示器的用法非常类似:
dorado.util.TaskIndicator.showTaskIndicator("测试主任务","main");
其中唯一的差别在于,多了一个"main"参数,在showTaskIndicator方法中通过这个参数判断是否需要阻塞效果。
与非阻塞任务指示器一样,我们还需要记得去关闭它,如本例:
var taskId = dorado.util.TaskIndicator.showTaskIndicator("测试后台任务", "main");
setTimeout(function() {
dorado.util.TaskIndicator.hideTaskIndicator(taskId);
}, 3000);
上面的代码首先通过showTaskIndicator方法返回的任务指示器的taskId,并调用利用timeout,在3秒钟后调用hideTaskIndicator方法隐藏创建的任务只是器
//----------------------------------------------------------------------------//
我们希望在一个新的页面中嵌入原来已经开发定义好的单表数据维护界面,则可以这么定义:
<?xml version="1.0" encoding="UTF-8"?>
<ViewConfig>
<View title="子视图" layout="padding:20">
<Panel caption="一个面板控件" collapseable="true" width="800" height="300" layout="padding:1">
<SubViewHolder subView="com.bstek.dorado.sample.data.SimpleCRUD" />
</Panel>
</View>
</ViewConfig>
以上代码部分,我们利用了SubViewHolder控件,并在subView属性中指定希望引用的页面的URL:com.bstek.dorado.sample.data.SimpleCRUD,最终效果如下:
http://wiki.bsdn.org/pages/viewpage.action?pageId=1509634
//----------------------------------------------------------------------------//
// @Bind #actionSave.onGetUpdateData
!function(arg){
arg.data = view.get("#dsProducts").getData("#");//设定需要提交的实体对象为dsProducts的当前记录
}
则最终这个UpdateAction执行的时候就只提交dsProducts中的当前记录。
另外如果UpdateAction中有多个UpdateItem,在Client-API中说明了:此事件在提交过程中会针对每一个UpdateItem触发一次。
因此编写代码的时候就需要区别对待不同的UpdateItem:
// @Bind #actionSave.onGetUpdateData
!function(arg){
if (arg.updateItem.alias=="dataset1"){
arg.data = view.get("#dataset1").getData("#");//设定需要提交的实体对象为dataset1当前记录
}
else if (arg.updateItem.alias=="dataset2"){
//什么都不做,默认根据UpdateItem的dataPath获取数据的操作
}
else if (arg.updateItem.alias=="dataset3"){
arg.data = view.get("#dataset3").getData();//设定需要提交的实体对象为dataset3的所有数据
}
else if (arg.updateItem.alias=="dataset4"){
arg.data = view.get("#dataset4").getData("[@.get(/"categoryName/").length > 5]");//设定需要提交的实体对象为dataset4中所有产品类型名称长度大于5的数据
}
}
//----------------------------------------------------------------------------//
注释格式:
1、单行(single-line)注释:“//……”
2、块(block)注释:“/*……*/”
3、文档注释:“/**……*/”
4、javadoc 注释标签语法
@author 对类的说明 标明开发该类模块的作者
@version 对类的说明 标明该类模块的版本
@see 对类、属性、方法的说明 参考转向,也就是相关主题
@param 对方法的说明 对方法中某参数的说明
@return 对方法的说明 对方法返回值的说明
@exception 对方法的说明 对方法可能抛出的异常进行说明
//----------------------------------------------------------------------------//
可设置的比较操作符号有:
符号
说明
like substr匹配
like* 匹配字符串前面的字符
*like 匹配字符串后面的字符
= 等于判断
<> 不等于判断
> 大于判断
>= 大于等于判断
< 小于判断
<= 小于等于判断
//----------------------------------------------------------------------------//
displayFormat
根据DataColumn的dataType设置数据的格式.
Date的format范例:
Date的format范例
说明
Y-m-d 返回类似"2000-09-25"的字符串
H:i:s 返回类似"23:10:30"的字符串
Y年m月d日 H点i分s秒 返回类似"2000年09月25日 23点10分30秒"的字符串
Float的format范例:
Float的format范例
说明
#,##0.00 123456789.789格式化为 123,456,789.79
$#,##0.00/DAY 1234.567格式化为 $1,234.57/DAY
(###)######## 02145375683格式化 (021)45375683
更详细的格式设置,请参考Client-API文档中:
Date
dorado.util.Common
//----------------------------------------------------------------------------//
readOnly
用于控制DataColumn的只读属性。支持可以动态设置:
dataColumn.set("readOnly", true/false);
通过js动态设置readOnly属性后DataColumn会动态调整自身的编辑模式。
//----------------------------------------------------------------------------//
renderer
功能同Grid的cellRenderer,详细说明请参考:Grid(DCUG)
通过DataColumn的cellRenderer属性,使我们可以为不同的DataColumn定制不同的cellRenderer。
Grid为DataColumn默认提供了几个CellRenderer的实现类:
dorado.widget.grid.DefaultCellRenderer:默认的表格列脚渲染器。
dorado.widget.grid.CheckBoxCellRenderer:用于将一个复选框填充到表格单元格中单元格渲染器。
dorado.widget.grid.RadioGroupCellRenderer:用于将一个单选框组填充到表格单元格中单元格渲染器。
dorado.widget.grid.ProgressBarCellRenderer:用于将一个进度条填充到表格单元格中单元格渲染器。
dorado.widget.grid.CheckBoxCellRenderer应用范例:
如果DataColumn的dataType属性为boolean或Boolean,则DataColumn会自动的将dorado.widget.grid.CheckBoxCellRenderer作为自身的单元格渲染器。但是如果数据类型是String类型,那么我们就可以通过定制renderer属性实现,如下范例:
如果你的数据无法与此匹配,则也可以通过如下的方式详细设定ProgressBarCellRenderer的属性:
// @Bind #grid.onCreate
!function(self, arg) {
MyCheckBoxCellRenderer = $extend(dorado.widget.grid.CheckBoxCellRenderer,{
createSubControl: function(arg) {
var checkbox = $invokeSuper.call(this, arguments);
checkbox.set({
offValue: "N",
onValue: "Y",
triState: true
});
return checkbox;
}
});
self.getColumn("ga").set("renderer", new MyCheckBoxCellRenderer());
}
//----------------------------------------------------------------------------//
我设定page,一页显示50笔资料,当我滚动条拉倒最下时,自动将第2页资料接到前1页资料后面显示,依次类推。
---可以,要设置Grid的supportsPaging属性为true
当然,也可以直接点击下一页看第2页资料。
--可以,通过datapilot
另外,还可以设定最大显示的页数,比如显示到第3页资料时,必须点下一页才能进入下一页显示第4页资料。
--不能通过属性设置实现,可以通过事件控制实现,dataSet提供了beforeLoadData事件,每一次页面加载的时候都会触发,该事件只要返回一个doraod.AbortException就可以阻止默认的数据加载动作。可以利用此事件接口实现你的业务逻辑。
//----------------------------------------------------------------------------//
if(arg.data){
var res;
ajaxWareHouse.set("parameter",arg.data).execute(function(e){
res=e;
});
if(res){
dsMain.getData("#").set("warehouseName",res.CKM);
}else{
throw new dorado.Exception("仓库编号不存在,或当前用户无权限!");
}
}
后台返回的是map
//----------------------------------------------------------------------------//
在DATATYP中的property中添加自定义校验事件
if(arg.data){
var res;
queryCk.set("parameter",{"ckbm": arg.data}).execute(function(e){
if(e.length == 1){
var ckm = e[0].NAME;
res = ckm;
}
});
if(res){
view.get("#dsMoreUpdate").getData("#").set({"endckname" : res });
}else{
view.get("#dsMoreUpdate").getData("#").set({"endckname" : null });
throw new dorado.Exception("仓库编码无效,请重新输入!");
}
}
注意要将queryCk这个ajaxAction的异步属性关闭
//----------------------------------------------------------------------------//
//@Bind #startcw.onBlur
//@Bind #endcw.onBlur
!function(self, arg){
var str = self.get("value");
if(str != null){
var uperStr = str.toUpperCase();
view.get("#dsMoreUpdate").getData("#").set(self.get("property"), uperStr);
}
};
//----------------------------------------------------------------------------//