Angular 2函数双击调用

时间:2017-11-09 10:34:49

标签: html json angular typescript for-loop

我正在使用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。

2 个答案:

答案 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