szjazz 发表于 2024-8-15 17:32:22

如何调用另一个脚本的类方法

学习参考了演示(体验)版里的脚本写法:P,
1、公共脚本GlobalScript,定义了OAClass类,一些常用的函数定义为方法,比如:转换浮点数toFloat(),大写金额toBigSum(),并创建了实例oaClass
2、应用脚本AppScript,定义了AppClass类,也创建了实例appClass
3、每个表单定义对应的脚本xxx_FrmScript,并创建了实例

var _self = this;
var Frm_BX_Class=new Class({
    initialize: function () {
      debugger
      this.cmsAction = o2.Actions.get("x_cms_assemble_control");
      this.processAction = o2.Actions.get("x_processplatform_assemble_surface");
      this.queryAction = o2.Actions.get("x_query_assemble_surface");
    },

    CalcActAmount:function(frmData){
      var num = parseFloat(frmData.datatable_detail.total.txtItemSum);
      if(!isNaN(num)){
            var deduct=parseFloat(frmData.txtDeduct);
            if(!isNaN(deduct)){
                var actSum=num-deduct;
                frmData.txtActAmount=actSum.toFixed(2);
            }
      }
    },

    ItemSumChange:function(frmData){
      var num = parseFloat(frmData.datatable_detail.total.txtItemSum);
      frmData.txtTotalAmount=num.toFixed(2);
      this.CalcActAmount(frmData);
    }
});

this.frm_bx_Class = new Frm_BX_Class();

在表单的queryLoad事件里引用了这些脚本
this.include({
    type : "cms", //应用类型。可以为 portalprocesscms。
    application : "公共信息", //门户、流程、CMS的名称、别名、id。 默认为当前应用
    name : "GlobalScript" //脚本配置的名称、别名或id
});

this.include("AppScript");
this.include("Frm_BX_Script");

想把该语句表单里的脚本里的语句:
var num = parseFloat(frmData.datatable_detail.total.txtItemSum);借助GlobalScript脚本里的toFloat(),请问如何引用oaClass里的toFloat函数



xadmin 发表于 2024-8-16 10:41:36

类方法调用就类似this.frm_bx_Class.CalcActAmount

szjazz 发表于 2024-8-16 11:20:17

本帖最后由 szjazz 于 2024-8-16 12:35 编辑

不可以
增加一条调试语句:alert(this.oaClass.toFloat(frmData.datatable_detail.total.txtItemSum));

然后打开F12,看到报错:



而如果是直接放在表单控件的脚本里使用,就可以
alert(this.oaClass.toFloat(this.data.datatable_detail.total.txtItemSum));
this.frm_bx_Class.CalcActAmount(this.data);

szjazz 发表于 2024-8-17 17:33:40

本帖最后由 szjazz 于 2024-8-17 17:36 编辑

当我将GlobalScript脚本的所有内容复制到Frm_BX_Script脚本文件里,然后在其类结构初始化时,增加创建实例,就可以了
Frm_BX_Script脚本文件里包含了GlobalScript的内容:
var _self = this;
var O2OA_Class=new Class({
    initialize: function () {
      this.cmsAction = o2.Actions.get("x_cms_assemble_control");
      this.processAction = o2.Actions.get("x_processplatform_assemble_surface");
      this.queryAction = o2.Actions.get("x_query_assemble_surface");
    },
    toInt:function(data){
      var rData=parseInt(data);
      if(isNaN(rData)){
            return 0;
      }else{
            return rData;
      }
    },   
    toFloat:function(data){
      var rData=parseFloat(data);
      if(isNaN(rData)){
            return 0;
      }else{
            return rData;
      }
    }
});

this.oaClass = new O2OA_Class();

增加创建实例:
var Frm_BX_Class=new Class({
    initialize: function () {
      this.cmsAction = o2.Actions.get("x_cms_assemble_control");
      this.processAction = o2.Actions.get("x_processplatform_assemble_surface");
      this.queryAction = o2.Actions.get("x_query_assemble_surface");
      this.oaClass=new O2OA_Class();
    },


但如果是在Frm_BX_Script脚本里不是复制过来内容,而是采用include语句包含进来的话,又不行了,请问为什么?
是否脚本里包含另一个脚本不能用include语句,或者格式不对?
this.include({
    type : "cms", //应用类型。可以为 portalprocesscms。
    application : "公共信息", //门户、流程、CMS的名称、别名、id。 默认为当前应用
    name : "GlobalScript" //脚本配置的名称、别名或id
});

var _self = this;
var Frm_BX_Class=new Class({
    initialize: function () {
      this.cmsAction = o2.Actions.get("x_cms_assemble_control");
      this.processAction = o2.Actions.get("x_processplatform_assemble_surface");
      this.queryAction = o2.Actions.get("x_query_assemble_surface");
      this.oaClass=new O2OA_Class();
    },

    CalcActAmount:function(frmData){
      alert(this.oaClass.toFloat(frmData.txtDeduct));
      var num = parseFloat(frmData.datatable_detail.total.txtItemSum);
      if(!isNaN(num)){
            var deduct=parseFloat(frmData.txtDeduct);
            if(!isNaN(deduct)){
                var actSum=num-deduct;
                frmData.txtActAmount=actSum.toFixed(2);
            }
      }
    },

    ItemSumChange:function(frmData){
      var num = parseFloat(frmData.datatable_detail.total.txtItemSum);
      frmData.txtTotalAmount=num.toFixed(2);
      this.CalcActAmount(frmData);
    }
});

this.frm_bx_Class = new Frm_BX_Class();


xadmin 发表于 2024-8-19 10:04:20

ExcelUtils = new Class({
    _loadResource : function( callback ){
      var uri = "/x_component_Template/framework/xlsx/xlsx.full.js";
      var uri2 = "/x_component_Template/framework/xlsx/xlsxUtils.js";
      COMMON.AjaxModule.load(uri, function(){
            COMMON.AjaxModule.load(uri2, function(){
                callback();
            }.bind(this))
      }.bind(this))
    },
    _openDownloadDialog: function(url, saveName){
      /**
         * 通用的打开下载对话框方法,没有测试过具体兼容性
         * @param url 下载地址,也可以是一个blob对象,必选
         * @param saveName 保存文件名,可选
         */
      if( Browser.name !== 'ie' ){
            if(typeof url == 'object' && url instanceof Blob){
                url = URL.createObjectURL(url); // 创建blob地址
            }
            var aLink = document.createElement('a');
            aLink.href = url;
            aLink.download = saveName || ''; // HTML5新增的属性,指定保存文件名,可以不要后缀,注意,file:///模式下不会生效
            var event;
            if(window.MouseEvent && typeOf( window.MouseEvent ) == "function" ) event = new MouseEvent('click');
            else
            {
                event = document.createEvent('MouseEvents');
                event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
            }
            aLink.dispatchEvent(event);
      }else{
            window.navigator.msSaveBlob( url, saveName);
      }
    },
    index2ColName : function( index ){
      if (index < 0) {
            return null;
      }
      var num = 65;// A的Unicode码
      var colName = "";
      do {
            if (colName.length > 0)index--;
            var remainder = index % 26;
            colName =String.fromCharCode(remainder + num) + colName;
            index = (index - remainder) / 26;
      } while (index > 0);
      return colName;
    },
    export : function(array, fileName){
      this._loadResource( function(){
            data = xlsxUtils.format2Sheet(array, 0, 0, null);//偏移3行按keyMap顺序转换
            var wb = xlsxUtils.format2WB(data, "sheet1", undefined);
            var wopts = { bookType: 'xlsx', bookSST: false, type: 'binary' };
            var dataInfo = wb.Sheets];

            var widthArray = [];
            array.each( function( v, i ){

                widthArray.push( {wpx: 100} );

                // var at = String.fromCharCode(97 + i).toUpperCase();
                var at = this.index2ColName(i);
                var di = dataInfo;
                // di.v = v;
                // di.t = "s";
                di.s = {//设置副标题样式
                  font: {
                        //name: '宋体',
                        sz: 12,
                        color: {rgb: "#FFFF0000"},
                        bold: true,
                        italic: false,
                        underline: false
                  },
                  alignment: {
                        horizontal: "center" ,
                        vertical: "center"
                  }
                };
            }.bind(this));
            dataInfo['!cols'] = widthArray,

                this._openDownloadDialog(xlsxUtils.format2Blob(wb), fileName +".xlsx");
      }.bind(this))
    },
    import : function( file, callback, dateColArray ){
      this._loadResource( function(){
            var reader = new FileReader();
            var workbook, data;
            reader.onload = function (e) {
                //var data = data.content;
                if (!e) {
                  data = reader.content;
                }else {
                  data = e.target.result;
                }
                workbook = XLSX.read(data, { type: 'binary' });
                //wb.SheetNames是获取Sheets中第一个Sheet的名字
                //wb.Sheets获取第一个Sheet的数据
                var sheet = workbook.SheetNames;
                var jsonList = [];
                for (var sheet in workbook.Sheets) {
                  if (workbook.Sheets.hasOwnProperty(sheet)) {
                        fromTo = workbook.Sheets['!ref'];
                        console.log(fromTo);
                        var json = XLSX.utils.sheet_to_json(workbook.Sheets);
                        console.log(JSON.stringify(json));
                        jsonList.push(json);
                        // break; // 如果只取第一张表,就取消注释这行
                  }
                }
                if(callback)callback(jsonList);
            };
            reader.readAsBinaryString(file);
      })
    }
});

这是个excel 的类,使用
this.include("ExcelUtils");
var excelUtils = new ExcelUtils();

var array = [];
array.push(["姓名","性别"]);
array.push(["张三","男"]);
excelUtils.export(array,"test-" +(new Date).format("db")); 您的代码需要自己检查看看

szjazz 发表于 2024-8-19 10:43:20

我已解决了,是指针不对引起的,类里的引用别的类需要先在外面定义指针,如: var _self=this,然后在里面就要用该变量,不能直接用this

var _self = this;
var Frm_BX_Class=new Class({
    initialize: function () {
      this.cmsAction = o2.Actions.get("x_cms_assemble_control");
      this.processAction = o2.Actions.get("x_processplatform_assemble_surface");
      this.queryAction = o2.Actions.get("x_query_assemble_surface");
    },

    CalcActAmount:function(frmData){
      alert(_self.oaClass.toFloat(frmData.txtDeduct));
      var num = parseFloat(frmData.datatable_detail.total.txtItemSum);
      if(!isNaN(num)){
            var deduct=parseFloat(frmData.txtDeduct);
            if(!isNaN(deduct)){
                var actSum=num-deduct;
                frmData.txtActAmount=actSum.toFixed(2);
            }
      }
    },

    ItemSumChange:function(frmData){
      var num = parseFloat(frmData.datatable_detail.total.txtItemSum);
      frmData.txtTotalAmount=num.toFixed(2);
      this.CalcActAmount(frmData);
    }
});

this.frm_bx_Class = new Frm_BX_Class();
页: [1]
查看完整版本: 如何调用另一个脚本的类方法