Javascript window.print() 方法只工作一次

标签 javascript angular

我在某个 Angular 项目的某个组件中实现了以下代码片段。我可以成功打印,但是当我第二次尝试时,未触发 onClickPrint() 方法。我错过了什么?

  onClickPrint() {
    const printContents = document.getElementById('permit').innerHTML;
    const originalContents = document.body.innerHTML;
    document.body.innerHTML = printContents;
    window.print();
    // document.body.innerHTML = originalContents;
    window.close();
  }


<button mat-button (click)="onClickPrint()" class="my-btn">Print licence</button>

<mat-card size="B4" class=" container w-100  bg" id="permit">

...

</mat-card> 

当我检查按钮时...

enter image description here

最佳答案

当您直接使用此代码修改 DOM 时:

const printContents = document.getElementById('permit').innerHTML;
const originalContents = document.body.innerHTML;
document.body.innerHTML = printContents;

这样做会破坏所有引用资料和我无法开始理解的内容。

为什么不使用单独的组件和路由来包含您要打印的内容,然后在加载该组件后在该组件上运行打印。

例如:

onClickPrint() {
    this.router.navigate(['/print-details']);
}

在小型服务中维护需要打印的细节:

class DetailService {
    public details;
}

在你的打印组件中

class PrintComponent implements AfterViewInit  {       
    ngAfterViewInit() {
        this.detailService.details; 
        // Finish out your component template view or whatever you need to do
        window.print();
    }
}

在 Angular 中工作时,尽量让 Angular 完成所有繁重的 DOM 工作。如果你绝对必须修改它,有一个类 Render2 可以提供帮助,但它是最后的选择。 https://angular.io/api/core/Renderer2

关于Javascript window.print() 方法只工作一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58398750/

相关文章:

javascript - jQuery 小部件 : global variable not consistent

javascript - Angular Service 提供默认值吗?

angular - 在 ngx-bootstrap 下拉列表中,外部点击不会关闭下拉列表。有什么解决办法吗?

javascript - 数组转换成字符串用于转换成数字但不起作用

javascript - 如何在JS中记下-1次方的切线

javascript - 创建 html 结构,每个 li 中只允许 3 个 div 元素。在 React + underscore.js 中

angular - 将 Angular 应用程序从版本 4.x.x 更新到 6.0

javascript - 使用 JQuery 选择页面上第一个元素中第一个出现的子元素?

angular - bindCallback 仅发出一次

javascript - 如何在 Angular 2 应用程序中从 TypeScript/JavaScript 中的字符串获取类?