项目上利用ISC权限系统控制页面按钮的显示,在原来添加到保存按钮的事件是_btnSave_onclick事件,在DataForm添加了validate(p_data, [p_withoutIndication]) 方法。在这儿方法里面写的是form表单的为空和长度的校验。下面是DataForm API给的关于validate解释
validate(p_data, [p_withoutIndication]) |
执行验证表单的逻辑。 返回一个对象(如 { successful: true }),该对象的 successful 属性表示该表单通过验证;如果返回对象为 { successful: false, hint: "描述错误原因。", fieldName: "错误字段名称" },其中 fieldName 是可选字段,是出错字段的 FormField.name,原因由 hint 描述。 该方法将触发 onvalidate 事件,可通过该事件进行自定义数据校验,详见该事件示例。 |
在没有更改save按钮的事件名称的时候form表单的validate方法还是可以用的,但是当我把事件名改为_buttonSave_onclick的时候validate就变的无效了,当然也就报错了。找了半天也没发现时什么原因,我和另一个同事猜测是UAP对save事件进行了监测,btnSave刚好在他的监测范围内吧,其他的就不生效了。
为了实现功能只好在调用方法里面又重新写了一下校验。校验成功以后昨天把UAP封装的DataForm.js扒开看了一下。
DataForm的保存js代码
/**
* 保存数据。
*/
me.save = function(p_data, p_callback)
{
var result = me.validate(p_data);
if (result.successful)
{
me.entityContainer.save(p_data, p_callback);
}
else
{
if ($notEmpty(result.hint))
{
mx.indicate("info", result.hint);
}
}
};
从代码里可以看到它的me.save方法是调用了validate的,在我们写的代码里我们直接调用me.view.getForm().entityContainer.save(),me.view.getForm()是得到DataForm的方法,下面的是entityContainer的save方法
/** * 调用后台服务,将新增和修改的内容保存到数据库。 保存前会调用 {@link validate} 方法检查数据值是否合法。 * * @overload function() * @overload function(p_path) * @param [p_path] * 指定的 REST 服务路径,请参见 {@link mx.rpc.RESTClient.post} 方法。 */ me.save = function() { if (!me.changed) { // 没有变更过的信息。 return; } // 阻止服务并发。 if (me._submitting) { return; } // 由于各数据容器参数情况不同,同一数据容器的参数也有若干重载情况,此处对参数按类型解析,不判断先后顺序。 var args = me._parseArgs(arguments); var p_path = args.path; var p_data = args.para; var p_callBack = args.callBack; // 保存参数中的回调函数,在加载完成后执行。 // 此处存在时序 BUG。频繁加载时,最后的回调函数会覆盖之前的,可能会引起异常。 // 鉴于这种情况出现几率较小,暂时保留此处理方式。 if ($notEmpty(p_callBack)) { me._saveCallBack = p_callBack; } else { me._saveCallBack = null; } var savePara = JSON.stringify(_parseSavePara(p_data)); var args = { cancel : false, data : me.data, param: savePara }; me.trigger("saving", args); if (args.cancel) { return; } // 根据规约,在基础路径(精确到类型信息)后面添加默认后缀作为保存服务的路径。 var saveUrl = ("save" in me.actions) ? me.actions["save"] : "save"; // 自定义保存路径后缀时,以自定义路径为准。 saveUrl = p_path || saveUrl; if ($notEmpty(me.client)) { me.client.post(saveUrl, savePara, _save_callback); me._submitting = true; } };
通过这两个js可以知道dataform的save方法的流转,但是从这里还是看不到为什么改变按钮触发的事件就会影响它的校验,还需要在继续的研究dataform的js方法。不过看源码对了解DataForm的方法和属性还是有帮助的。