Разрыв страницы не работает с ngFor в Angular 13

Я немного поискал решение, но разрывы страниц в компоненте Angular 13 не будут разбивать страницы.

Я использую простой ng-шаблон (лишние поля удалены для удобства чтения):

<ng-template #testTemplate let-allTheData>
  <div *ngFor = "let dataItem of allTheData" >
    <div><b>ID:</b> {{ dataItem.id }}</div>
    <div style = "break-after:always;">&nbsp;</div>  <-- non-working page break
  </div>

Шаблон настроен как ViewChild следующим образом:

@ViewChild('testTemplate ') testTemplate !: TemplateRef<any>;

Данные передаются и обрабатываются через цикл

 data.forEach(x => {
      theThing = {};
      theThing.id = arrtId;
      this.theData.push(theThing);
    });

И диалог печати вызывается с помощью этой строки (используя ngx-print):

this.printer.printAngular(this.testTemplate);

Данные отображаются нормально на экране печати, но разрыв страницы в шаблоне не вставляет разрыв страницы - шаблон мешает? Я также пробовал «перерыв-после: страница», «перерыв-после: авто» и даже «разрыв-перед: страница», «разрыв-перед: авто» и «разрыв-перед: всегда». Я также попытался использовать мультимедийные запросы CSS, которые я видел в нескольких поисках, и добавить «! Важно» во встроенный CSS. Ничего еще не сработало. У кого-нибудь есть идеи? Благодарю вас!

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
0
48
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я предполагаю, что синтаксис CSS немного отличается page-break-after: always.

  <div style = "page-break-after: always" *ngFor = "let dataItem of allTheData" >
    <div><b>ID:</b> {{ dataItem.id }}</div>
  </div>

  <button (click) = "onPrint()">Print</button>
@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
})
export class AppComponent {
  name = 'Angular ' + VERSION.major;
  allTheData = [{ id: 1 }, { id: 2 }, { id: 3 }];
  constructor() {}

  onPrint() {
    window.print();
  }
}

Рабочий пример: https://stackblitz.com/edit/angular-ivy-9wgfdt?file=src%2Fapp%2Fapp.component.ts

Извините, я должен был быть яснее, что отличается в моем примере. Я улучшу свой комментарий. Если вы применили правильный синтаксис CSS, переместите #testTemplate от <ng-template> к <div>, например. ng-template не отображается в шаблоне, поэтому вам не на что ссылаться. Тогда звоните this.printer.printAngular(this.testTemplate); в ngAfterViewInit(). <div> с #testTemplate становится доступным в начале этого цикла.

<ng-template let-allTheData>
  <div #testTemplate 
       style = "page-break-after: always"
       *ngFor = "let dataItem of allTheData">
    <div><b>ID:</b> {{ dataItem.id }}</div>
  </div>
ngAfterViewInit() {
   this.printer.printAngular(this.testTemplate);
}

Это определенно работает, но я также пытаюсь использовать шаблон Angular и ngx-printer, и разрывы страниц не отображаются с этой конфигурацией. Если я не добьюсь там никакого прогресса, возможно, мне нужно пересмотреть подход, но спасибо за ваш ответ.

ewomack 22.03.2022 13:55

Извините, я должен был быть яснее, что отличается в моем примере. Я улучшу свой комментарий. Если вы применили правильный синтаксис CSS, переместите #testTemplate от <ng-template> к <div>, например. ng-template не отображается в шаблоне, поэтому вам не на что ссылаться. Тогда звоните this.printer.printAngular(this.testTemplate); в ngAfterViewInit(). <div> с #testTemplate становится доступным в начале этого цикла.

Joosep.P 22.03.2022 16:04

В итоге это приняло совсем другой оборот — мы использовали ngx-printer и переключились на ngx-print, и с этой библиотекой все работало нормально, включая разрывы строк. Так что на самом деле у меня не было возможности попробовать решение, которое вы опубликовали, но я все равно отмечу его как лучший ответ. Спасибо за ваш вклад.

ewomack 23.03.2022 18:13

Другие вопросы по теме