我正在使用jsPDF
从json数据创建pdf <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet" />
<link href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.100.2/css/materialize.min.css" rel="stylesheet" />
<script src="https://use.fontawesome.com/1e005331dc.js"></script>
<div class='card'>
<div class="ds-table">
<div class="ds-table-cell">
<span class='card-title'>Title</span>
<i class='material-icons right'>delete</i>
</div>
</div>
</div>
}
我通过html按钮点击
来调用此功能 responseStatus:any= [];
pdfDownload(){
this._isuGeoSubunitReportService.SubmitISUGEO(this.isugeosubunitTO)
.subscribe(data =>this.responseStatus = data,
err => console.log(err),
() => console.log('Request Completed222')
);
var header = [];
var data = [];
var totalData = [];
var doc = new jsPDF('p', 'pt', 'letter');
doc.cellInitialize();
doc.setFontSize(10);
var count = 0;
for(let isugeo of this.responseStatus.dynaModel){
count++;
for(let isugeomap of this.generateArray(isugeo.map)){
if(count==1){
header.push(isugeomap.key);
}
}
}
for(let isugeo of this.responseStatus.dynaModel){
let temp = [];
for(let isugeomap of this.generateArray(isugeo.map)){
temp.push(isugeomap.value);
}
data.push(temp);
}
console.log('Request Completed2......22'+ JSON.stringify(data));
doc.autoTable(header,data,{
margin: {horizontal:1,top:1},
styles: {overflow: 'linebreak',theme: 'grid' },columnStyles: {
0: {columnHeight: 5}
}});
doc.save('Test.pdf');
现在的问题是当我点击点击按钮时,第一次数据不是来自订阅块,并且在第一个'for'循环中给出错误,数据长度为零。第二次按下按钮数据后显示。
为什么每次都要两次点击生成正确的pdf。
答案 0 :(得分:4)
它不需要“两次点击”来生成您的PDF:我会向您解释。
首先,创建变量:
responseStatus:any= [];
里面什么也没有。然后,您在点击时进行HTTP调用:
this._isuGeoSubunitReportService
.SubmitISUGEO(this.isugeosubunitTO)
.subscribe(data => this.responseStatus = data,
err => console.log(err),
() => console.log('Request Completed222')
);
现在你必须明白,这是一个异步调用。这意味着,它将进行调用,但代码将继续运行!一旦响应存在,它将处理订阅内的内容。
这意味着您之后的代码,即
var header = [];
var data = [];
var totalData = [];
// ...
doc.save('Test.pdf');
当您还在等待回复时,会启动。
如果您要等待响应,则必须将所有代码移至订阅,或移至调用订阅的函数中。
否则,您必须“点击2次”!
答案 1 :(得分:1)
错误是因为您正在进行同步的AJAX调用并且'for'循环运行
在成功完成之前Sub connect2OnlineSQL()
' Note: add referecne to Microsoft ActiveX Data Objects #.# Library
' Tools > References > (scroll down...)
Set remoteCon = New ADODB.Connection
conStr = "DRIVER={MySQL ODBC 5.3 Unicode Driver};" & _
"SERVER=something.heliohost.org;PORT=3306;DATABASE=db_name;" & _
"UID=db_user;PWD=yourPassWordHere"
remoteCon.Open conStr
remoteCon.Execute ("USE db_name;")
End Sub
为this.responseStatus.dynaModel
。您需要
在数据到达后执行undefined
循环,如下所示:
for