首页 > 解决方案 > 如何在角度 8 中从一个组件访问另一个组件的 div id

问题描述

我有一个标题组件和主组件。在标题组件中有一个下载按钮,当我单击下载按钮时,将下载主组件的内容,因此我需要从标题组件访问主组件的 div id(内容)。我不知道该怎么做。

header.component.html

<button (click)="generarPDF()" type="button" class="btn btn-primary">Download</button>
<nav *ngIf="router.url !== '/' && router.url !== '/login'" class="mb-3 navbar navbar-expand-sm bg-dark-custom navbar-dark">
  <!-- Brand/logo -->
  <a class="navbar-brand" routerLink="/"><img class="img-responsive" src="../assets/logo.png"></a>
</nav>

header.component.ts

import { Component, OnInit } from '@angular/core';
import { Router }  from "@angular/router";

@Component({
  selector: 'app-header',
  templateUrl: './header.component.html',
  styleUrls: ['./header.component.css']
})
export class HeaderComponent implements OnInit {

  constructor(public router: Router){} 

  ngOnInit() {
  }

}

home.component.html

<div class="container-fluid" id="content">
  <div class="row">
    <div class="col-md-6">
      <div class="mb-3 text-left">
        <div>Total Expenses are: <b>Rs. {{this.sum}}</b></div>
      </div>
    </div>
    <div class="col-md-6">
      <div class="mb-3 text-right">
        <input [(ngModel)]="searchText" autocomplete="off" class="col-md-6 searchinput" type="text"
          placeholder="Search.." />
      </div>
    </div>
  </div>
  <div class="row">
    <div class="col-md-12">
      <table class="table table-bordered expensetable">
        <thead>
          <tr>
            <th>Date</th>
            <th>Treatment</th>
            <th>Expenses (INR)</th>
            <th>Results</th>
          </tr>
        </thead>
        <tbody>
          <ng-container *ngIf="( getListData | filter:searchText) as result">
            <tr *ngFor="let item of result">
              <td>{{item.Date}}<div><small>({{item.day}})</small></div>
              </td>
              <td [innerHtml]="getTreatment(item.Treatment)"></td>
              <td>{{item.Expenses}}</td>
              <td><span placement="left" ngbTooltip="{{item.Description}}" class="{{item.Result}}"><i
                    class="las la-info-circle info"></i> Info</span></td>
            </tr>
            <tr *ngIf="result.length === 0">
              <td colspan="4" class="text-center">No Data Found</td>
            </tr>
          </ng-container>
        </tbody>
      </table>
    </div>
  </div>
</div>

home.component.ts

import { Component, OnInit,ViewChild, ElementRef} from '@angular/core';
import { CommonserviceService } from './../utilities/services/commonservice.service';
import {NgbModal, ModalDismissReasons} from '@ng-bootstrap/ng-bootstrap';
import jsPDF from 'jspdf';
import html2canvas from 'html2canvas';

@Component({
  selector: 'app-home',
  templateUrl: './home.component.html',
  styleUrls: ['./home.component.css']
})
export class HomeComponent implements OnInit {
  getListData: any;
  sum:number;
  constructor(private modalService: NgbModal,private commonserviceService: CommonserviceService) { }
  @ViewChild('content', { 'static': true}) content:ElementRef;
  
  ngOnInit() {
      this.getHeroes();
  }
  getTreatment(data) {
    console.log(data);
    let str = '<div class="demooutput">'
    let arr = data.split(',');
    if (arr.length > 0) {
      for (let i = 0; i < arr.length; i++) {
        str += '<span class="' + arr[i] + '">' + arr[i] + '</span>'
      }
    }
    str += '</div>'
    return str
  }
getHeroes(){
   this.commonserviceService.getData().subscribe(getListData =>{
          this.getListData = getListData;
          console.log(this.getListData);
          this.sum=0;
  for(let a of this.getListData){
  this.sum=this.sum+a.Expenses;
     
  }
   console.log(this.sum);
  },
      (error) => {
      alert('No data');
      }
  );
}

generarPDF() {
  
  const div = document.getElementById('content');
  const options = {
    background: 'white',
    scale: 3
  };

  html2canvas(div, options).then((canvas) => {

    var img = canvas.toDataURL("image/PNG");
    var doc = new jsPDF('l', 'mm', 'a4', 1);

    // Add image Canvas to PDF
    const bufferX = 5;
    const bufferY = 5;
    const imgProps = (<any>doc).getImageProperties(img);
    const pdfWidth = doc.internal.pageSize.getWidth() - 2 * bufferX;
    const pdfHeight = (imgProps.height * pdfWidth) / imgProps.width;
    doc.addImage(img, 'PNG', bufferX, bufferY, pdfWidth, pdfHeight, undefined, 'FAST');

    return doc;
  }).then((doc) => {
    doc.save('postres.pdf');  
  });
}
}

app.component.html

<app-header></app-header>
<router-outlet></router-outlet>
<app-footer></app-footer>

app.component.ts

import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'sampleproject';
}

标签: javascripthtmlangular

解决方案


您可以output/eventEmitter在父组件上使用 an 来执行此操作,但您需要将 包含<app-header>home组件中而不是app组件中。

如果您想保留<app-header>app组件中,您将需要另一种方法,可能使用服务在标头和主组件之间进行通信。

header.component.html

<button (click)="downloadClicked.emit(null)" type="button" class="btn btn-primary">Download</button>

header.component.ts

export class HeaderComponent implements OnInit {

  @Output() 
  downloadClicked: EventEmitter<any> = new EventEmitter();

  constructor(public router: Router){} 

  ngOnInit() {
  }   
}

home.component.ts

<app-header (downloadClicked)="generarPDF()"></app-header>
<div class="container-fluid" id="content">
...

app.component.html

<router-outlet></router-outlet>
<app-footer></app-footer>

推荐阅读