解析模块的数据传不到逻辑模块

  1. SampleTime.prototype.getSampleStateBySampleNo 是数据解析模块;
    SampleTime是JS交互逻辑模块;
    SampleTime.prototype._setSampleNo是关联模块;
  2. 关联模块传输数据到解析模块是正常的,但是传输到交互模块就没数据了,本来调用存储过程是正
    常的,代码量有些大,不便之处多多海涵,同事说this的指向有问题,但不知道怎么修改
  3. 所有代码:

    // JScript 文件

function SampleTime() {

var times = this._rowsData;
console.log(times);
//计算宽度,总和:
var totals = 0;
for (var  total= 0;total < times.length;total++){
    totals += times[total];
}
var firstTimes = [];
for (var f=0;f < times.length;f++){
    if (times[f] != 0) {
        firstTimes.push(Math.round(100/totals*times[f]) + '%');
    }else{
        firstTimes.push('0%');
    }
}

var list = [
    ['采样', times[0]],
    ['送检', times[1]],
    ['签收', times[2]],
    ['已登记', times[3]],
    ['IOM', times[4]],
    ['离心', times[5]],
    ['去盖', times[6]],
    ['测试中', times[7]],
    ['已上传', times[8]],
    ['已发送', times[9]]
];

var container = document.querySelector('.container');
var timeBox = document.querySelector('.timeBox');
//横向:
var _htmlLine = '<p>耗时</p>';
//纵向
var _htmlParallel = '<p>耗时明细</p>'

for (var j = 0;j < list.length; j++) {
    //横向:
    _htmlLine +=
        '<div class="lineBox" style="width:'+ firstTimes[j] +'" > ' +
            '<div class="top"><b>●</b><p>' ;
                    if(firstTimes[j]!=='0%') {
                        _htmlLine += list[j][1];
                    }
    _htmlLine+= '</p></div>' +
                    '<div class="bottom"><p>';
                        if(firstTimes[j]!=='0%') {
                            _htmlLine += list[j][0];
                        }
    _htmlLine+= '</p></div></div>';



    //纵向:
    _htmlParallel +=
        '<div class="time" style="height:'+ firstTimes[j] +'">' +
            '<div class="left"><b>●</b><P>';
           if(firstTimes[j]!=='0%'){
               _htmlParallel += list[j][0];
           }
    _htmlParallel += '</P></div>' +
        '<div class="right"><p>';
        if(firstTimes[j]!=='0%') {
            _htmlParallel += '时间: ' + this.Gos[0];
        }
    _htmlParallel += '</p><span>';
        if(firstTimes[j]!=='0%') {
            _htmlParallel += '描述: ' + this.Gos[1];
        }
    _htmlParallel += '</span></div></div>'

}
container.innerHTML = _htmlLine;
timeBox.innerHTML = _htmlParallel;


//TAT
var rounds = document.querySelector('div.round');
var _watchHtml = '';

this._valueDatas.forEach(function (value,index,array) {
    value = eval('('+ value +')');
    //console.log(value)
    var maxTat = value.c3text;
    var fwcTat = value.c4text;
    var difTat = (maxTat - fwcTat);
    var colors = difTat/maxTat;
    var _valueLengths = value.c3text.length;

    _watchHtml += '<div class="watchBox"><div class="watch w'+index+'"></div></div>'
    var wat=document.createElement('div');
    wat.setAttribute('class','watchBox');
    wat.innerHTML='<div class="watch w'+index+'"></div>';
   // rounds.innerHTML = _watchHtml;
    rounds.appendChild(wat)

    //仪表盘配置参数
    var watch = echarts.init(document.querySelector('.w'+index));
    var option = {
        toolbox: {
            show: false
        },
        tooltip: {
            formatter: "{a} <br/>{b} : {c}%"
        },
        textStyle: {
            fontSize: 8,
        },
        series: [
            {
                type: 'gauge',
                radius: '100%',
                clockwise: true,
                splitNumber: _valueLengths,
                center: [110, 90],
                min: 0,
                max: Math.round(value.c3text),
                detail: {
                    formatter: '{value}min',
                    fontSize: 10,
                    offsetCenter: ['0%','60%']
                },
                data: [{value: difTat}],
                axisLine: {
                    show: true,
                    lineStyle: {
                        color: [
                            [colors,'#29b6f6'],
                            [fwcTat/maxTat,'#ffa726'],
                            [1,'#f44336'],
                        ]
                    }
                },
                splitLine: {
                    show: false
                },
                axisLabel: {
                    distance: 5,
                    fontSize: 10,
                    formatter: function(v){
                        return v.toFixed(0);
                    },
                },
                pointer: {
                    show: true,
                    length: '60%',
                    width: 5,
                }
            }
        ]
    }
    watch.setOption(option);
})

//console.log(this._datas)
//条形图
var line = echarts.init(document.getElementById('line'));
line.showLoading();   //加载数据时动画显示
line.setOption({
    title: {
        text: '测试项所花时间',
        top: '10%',
        textStyle: {
            color: '#9c27b0',
            fontSize: 18
        }
    },
    tooltip: {
        //trigger: 'axis',   //放大镜
        axisPointer: {
            type: 'shadow'
        }
    },
    grid: {
        left: '0%',
        right: '0%',
        bottom: '0%',
        containLabel: true
    },
    xAxis: {
        type: 'value',
        boundaryGap: [0, 0.5],
        minInterval: 1,

    },
    yAxis: {
        type: 'category',
        data: this._values,
        axisTick: {
            alignWithLabel: true,
        }
    },
    series: [
        {
            name: '选项之间所花时间',
            type: 'bar',
            data: this._datas,
        }
    ]
})
line.hideLoading();   //加载完毕后隐藏

}

//調用標本信息
SampleTime.prototype._setSampleNo = function( nSampleNo ) {

//清除表数据
this._tableLogInfo = null;
//alert(nSampleNo);
SampleTime.prototype.getSampleStateBySampleNo(nSampleNo);
SampleTime();

}

// 交互模塊,柱状图 横向 纵向时间轴
SampleTime.prototype.getSampleStateBySampleNo = function (p) {

//console.log(p);
//横向存储过程
var Request = Global.NewMessage();
Request.ProcedureName = "[proc_datalink_getsample_module]";
Request.ParameterNames = ["SampleNo"];
Request.ParameterDataTypes = ["int"];
Request.ParameterValues = [p||1]
//PostMessage 异步需回调
var Return = Global.SendMessage("DB_CallProcedure", Request);
var Returns = Return.Table0;
//console.log(Returns)

this.rowsData = [];
this._rowsData = [];
this._rowsData = Returns._rowsData[0];
var datas = [];
var times = [];
for (var data = 0; data < this._rowsData.length; data++) {
    times.push(this._rowsData[data]);
    datas.push(new Date(this._rowsData[data]).getMinutes());
}
//分钟,柱状图 横向时间轴
this._rowsData = datas;
console.log(this._rowsData)

//完整时间,纵向时间轴
this.rowsData = times;
this.rowsTime = []
for (var w = 0;w < this.rowsData.length;w++){
    if (this.rowsData[w] != null){
        this.rowsTime.push(this.rowsData[w]);
    }
}
//混合数组
this.dataValues = [
    ["采样", this._rowsData[0]],
    ["送检", this._rowsData[1]],
    ["签收", this._rowsData[2]],
    ["已登记", this._rowsData[3]],
    ["IOM", this._rowsData[4]],
    ["离心", this._rowsData[5]],
    ["去盖", this._rowsData[6]],
    ["测试中", this._rowsData[7]],
    ["已上传", this._rowsData[8]],
    ["已发送", this._rowsData[9]]
]
this.dataValues.sort(function (a, b) {
    return a[1] - b[1];
});
this._values = [];
this._datas = [];
for (var i = 0; i < this.dataValues.length; i++) {
    this._values.push(this.dataValues[i][0]);
    this._datas.push(this.dataValues[i][1]);
}
//console.log(this._datas)

//纵向调用:
var Requests = Global.NewMessage();
Requests.ProcedureName = "[proc_datalink_getsample_moduleinfo]";
Requests.ParameterNames = ["SampleNo","SampleState"];
Requests.ParameterDataTypes = ["int","int"];
Requests.ParameterValues = [400,420];

var Go = Global.SendMessage("DB_CallProcedure", Requests);
this.Gos = Go.Table0._rowsData[0];

//TAT仪表盘数据调用
var configType = "machine";
var moduleName = "TATWarningCFG";
var configName = "data";
var value = top.UniformConfig.readValue(configType, moduleName, configName, "");
if (value == "") {
    return false;
}
this._valueDatas = JSON.parse(value).SearchCondition;

}
SampleTime.prototype.getSampleStateBySampleNo(1);

阅读 1.8k
2 个回答

谢邀先!
不过先提醒你稍微学一下markdown的语法,把语句标示出来,否则直接插入的语句可能会被系统处理而不能表达完整的意思了。请先处理这点。

function SampleTime() {
    var times = this._rowsData;
    ...
    this._valueDatas.forEach(
    ...
}
//調用標本信息
SampleTime.prototype._setSampleNo = function( nSampleNo ) {
    //清除表数据
    this._tableLogInfo = null;
    //alert(nSampleNo);
    SampleTime.prototype.getSampleStateBySampleNo(nSampleNo);//A
    SampleTime();//B
}

// 交互模塊,柱状图 横向 纵向时间轴
//定义初始值的吧
SampleTime.prototype.getSampleStateBySampleNo = function (p) {
    ...
    this.rowsData = [];
    this._rowsData = [];
    this._rowsData =
    ...
}

SampleTime.prototype.getSampleStateBySampleNo(1);//C

1.为什么要用prototype来定义方法,直接函数不好么?
2.既然要用prototype来访定义方法,那就好好使用JS面向对象的方法

问题出在:
C处代码调用时的this为SampleTime函数对象的prototype属性对象
A处代码调用时的this为SampleTime函数对象的prototype属性对象
B处代码调用时的this为全局对象

那么也即是所你在C、A处设置的参数,对B处的函数体代码来说完全没有用

看下下面代码,你就会明白:

function TEST(){
    this._p="TEST";
    console.log("this_p1:"+this._p1);
    console.log("this_p2:"+this._p2);
}

TEST.prototype.fun1=function(){
    this._p="fun1";
}

TEST.prototype._run_=function(){
    TEST.prototype.fun1();
    TEST();
}

TEST.prototype.fun1=function(){
    this._p1="fun1";
}
TEST.prototype.fun2=function(){
    this._p2="fun2";
}

TEST.prototype.fun2();
TEST.prototype._run_();
//this_p1:undefined
//this_p2:undefined
console.log(TEST.prototype._p1);//fun1
console.log(TEST.prototype._p2);//fun2
console.log(this._p);//TEST
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题