反向生成本体时主键关系不是fID
如果数据库中的主键关系不是fID,在反向生成本地的时候选择关系时把主键字段也选择上,这样概念映射中的主键就会映射为数据库对应的字段的名字 概念的主键必须要设置默认值,平台默认的是guid(),如果不需要是guid可以自己在概念定义中修改 如果需要在页面中操作主键关系的值,需要自己在反向生成本体后自己手动到概念中新增一个关系,关系标识跟数据库中的主键名一致,然后在概念定义的主键关系上选择这个关系,需要注意的是此时的主键默认值需要在关系定义上设置
如果数据库中的主键关系不是fID,在反向生成本地的时候选择关系时把主键字段也选择上,这样概念映射中的主键就会映射为数据库对应的字段的名字 概念的主键必须要设置默认值,平台默认的是guid(),如果不需要是guid可以自己在概念定义中修改 如果需要在页面中操作主键关系的值,需要自己在反向生成本体后自己手动到概念中新增一个关系,关系标识跟数据库中的主键名一致,然后在概念定义的主键关系上选择这个关系,需要注意的是此时的主键默认值需要在关系定义上设置
日历组件的高度是固定的,而且没有提供设置高度的地方,高度是由里面的日期的高度具体的 如果需要修改可以通过如下样式控制 .cal-month-day{ height:20px; } .cal-year-box [class*="span"], .cal-month-box [class*="cal-cell"]{ min-height:20px; } 效果如下:
分页加载的时候在非第一页操作数据后刷新数据,默认的会定位到第一页,如果需要定义到刷新数据的当前页可以参考如下: 下面的方案都用的用pagerBar组件分页 自己写一个按钮执行刷新具体的代码如下: Model.prototype.button42Click = function(event){ var data = this.comp("bizData1"); var currentpageIndex = this.comp("pagination1").currentIndex;//通过pageBar里面的pagination获取到当前页的索引 data.loadPageData(currentpageIndex + 1);//用data组件的loadPageData (integer pageIndex, Object options)分页模式下加载第N页数据 };
grid中列内容多时默认是在一行显示的,不太美观 在grid上提供了onCellRender 单元格显示渲染事件,我们可以通过这个事件使内容后面用...显示,如下: 把具体的内容给div显示,在div中通过样式控制显示... Model.prototype.grid1CellRender = function(event) { if (event.colName == "fWB" && event.colVal != undefined) {//判断是不是需要换行显示的这列并且列是有值的 event.html = " <div style='overflow: hidden;white-space: nowrap;text-overflow: ellipsis;'>" + event.colVal + "</div> ";//在div中显示列的值event.colVal } }; [...]
attachmentPC默认不是把上传的附件以列表的形式展现,如果需要列表显示展现,如下修改,使用的时候可以直接赋值到自己的.w中,然后把bind-ref改为自己的关系 <div component="$UI/system/components/justep/attachment/attachmentPC" access="duud" xid="attachmentPC4" bind-ref="$model.mainData.ref("fFJ")"> <div class="x-attachment-pc" xid="div68"> <div class="x-attachment-content x-card-border" xid="div69"> <div class="x-doc-process" xid="div70"> <div class="progress-bar x-doc-process-bar" role="progressbar" style="width:0%;" xid="progressBar4"/> </div> <div class="x-attachment-cell x-attachment-item" data-bind="style:{display:$state.get() == 'upload' && $access.get() % 512 >= [...]
平台默认提供了checkPermissionAction(验证是否拥有权限)这个action 如果需要通过判断某具体的功能是否有权限对页面进行控制,可以自己在java中调用checkPermissionAction,具体的参数设置参考如下: public static void testPermission(){ //定义一个Map遍历把需要判断的功能的process和activity放到Map中,可以定义多个Map放不同的功能 Map<String, String> funcParams = new HashMap<String, String>(); funcParams.put("process", "/appdemo/test/process/button/buttonProcess"); funcParams.put("activity", "mainActivity"); //定义checkPermissionAction需要的list参数,把功能的Map添加多list中 List<Map<String, String>> actionParam = new ArrayList<Map<String, String>>(); actionParam.add(funcParams); //定义调用action的ActionUtils.invokeAction这个方法进行传参的Map参数,把List添加到Map中 Map<String, Object> params = new HashMap<String, [...]
平台默认在$UI/system/lib/base/bizUtil中提供isDisabledAction (ModelBase model, String action) 判断当前动作是不是禁用的(即没有权限的保护动作) 当需要通过action权限控制按钮等组件是否可用时,需要如下步骤 1.在process文件中添加动作设置时访问权限为protected 2.如果页面中有bizData不用进行引用,如果没有bizData需要在js中进行引用 var biz = require("$UI/system/lib/biz"); 3.在按钮的bind-disable上设置表达式biz.Util.isDisabledAction($model, 'xxxAction') 如果需要分配action的权限,在“组织权限——角色管理”功能中,功能列表中找到对应的功能设置动作权限
平台默认提供了checkPermissionAction(验证是否拥有权限)这个action 如果需要通过判断某具体的功能是否有权限对页面进行控制,可以自己在js中调用checkPermissionAction,具体的参数设置参考如下: Model.prototype.button6Click = function(event) { var process = "/appdemo/test/process/attachment/attachmentProcess";//要判断的功能的process路径 var activity = "mainActivity";//要判断的功能的activity var param = new biz.Request.ListParam();//定义checkPermissionAction需要的list参数 var item1 = new biz.Request.MapParam();//定义map参数,把要判断的proces和activity放到Map中 item1.put("process", new biz.Request.SimpleParam(process, XML.Namespaces.XMLSCHEMA_STRING)); item1.put("activity", new biz.Request.SimpleParam(activity, XML.Namespaces.XMLSCHEMA_STRING)); param.add(item1);//把Map参数添加到list中可以添加多个功能的Map var [...]
在定义的action中勾选了启用日志,那么在操作这个action时,平台就会向日志表SA_Log中插入一条操作记录 如果在记录操作日志的时候需要自己向SA_Log的扩展字段或者自己的表中插入数据,可以用拦截器实现 拦截器可以在/BIZ/system/config/interceptor.config.m中定义,推荐用扩展空间修改这个文件 需要注意的是自己加的拦截器定义信息要放到平台默认的logAfter这个下面,便于在自己的拦截器中获取平台默认生成的日志记录的信息 具体参考如下: 1.interceptor.config.m中配置拦截器 <item name="selfLog" value="/demo/misc/logic/code,LogAction,after" /> name可以自己取 value属性值,第一个逗号前面的是自己定义的拦截器的java所在的模块路径 第二个逗号前面的是定义的拦截器的java的类,(需要注意的是如果是在src下定义的那么要在java类前面添加包名,如com.justep.system.interceptor.LogAfter,其中com.justep.system.interceptor包名,LogAfter是类名) 最后的after或者是before是指在action执行前或者执行后执行这个逻辑 2.java中的定义 import com.justep.model.Action; import com.justep.system.action.Interceptor; import com.justep.system.context.ActionContext; import com.justep.system.context.ContextHelper; import com.justep.system.data.KSQL; import com.justep.util.Utils; public class LogAction implements Interceptor [...]
data中提供的有find (List fields, List values, boolean first, boolean caseInsensitive, boolean partialKey, boolean all) 数据查找,根据列和值匹配进行数据查找,可以匹配多列根据列和值匹配进行数据查找,可以匹配多列 返回的是List行对象数组 如果需要把查找出来的数据loadData给其他data展现,需要对数据进行处理不能直接展现,如下: Model.prototype.button6Click = function(event) { var bizData = this.comp("bizData1"); bizData.refreshData(); var findrows = bizData.find([ 'fName' ], [ 'test' ], [...]