Prime ng: программно определить размер p-аккордеона, который присутствует внутри p-сплиттера

Пожалуйста, смотрите мой код компонента ниже:

У меня есть p-сплиттер, который разделен на 3 секции. У меня в каждой секции есть р-гармошка, которая, в свою очередь, имеет р-таблицу.

<div class = "card w-full">
        <p-splitter [panelSizes] = "[30, 40, 30]" styleClass = "mb-5">
            <ng-template pTemplate>
                <p-accordion [activeIndex] = "0" styleClass = "h-full">
                    <p-accordionTab header = "Signed PDF Documents">
                        <div class = "flex justify-content-between">
                            <div>
                                <h6>Proposal PDF Documents</h6>
                            </div>
                            <div><a>Add Attachment(s)</a></div>
                        </div>
                        <ng-template pTemplate>
                            <p-table [value] = "documentList" styleClass = "p-3 p-datatable-striped">
                                <ng-template pTemplate = "header">
                                    <tr>
                                        <th pSortableColumn = "name">Attachment Name
                                            <p-sortIcon field = "name"></p-sortIcon>
                                        </th>                                            
                                    </tr>
                                </ng-template>
                                <ng-template pTemplate = "body" let-doc>
                                    <tr>
                                        <td><a>{{ doc.name }}</a></td>
                                    </tr>
                                </ng-template>
                            </p-table> 
                        </ng-template>                              
                    </p-accordionTab>
                </p-accordion>   
            </ng-template>
            <ng-template pTemplate>
                <p-accordion [activeIndex] = "0" >
                    <p-accordionTab header = "Papervision Documents">
                        <div class = "flex justify-content-between">
                            <div>
                                <h6>Scanned Contract Documents</h6>
                            </div>                                
                        </div>
                        <ng-template pTemplate>
                            <p-table [value] = "paperDocumentList" styleClass = "p-3 p-datatable-striped">
                                <ng-template pTemplate = "header">
                                    <tr>
                                        <th pSortableColumn = "number">Customer Number
                                            <p-sortIcon field = "number"></p-sortIcon>
                                        </th>
                                        <th pSortableColumn = "name">Customer Name
                                            <p-sortIcon field = "name"></p-sortIcon>
                                        </th>
                                        <th pSortableColumn = "type">Doc Type
                                            <p-sortIcon field = "type"></p-sortIcon>
                                        </th>
                                        <th pSortableColumn = "docNumber">Doc Number
                                            <p-sortIcon field = "docNumber"></p-sortIcon>
                                        </th>
                                        <th pSortableColumn = "docDate">Doc Date
                                            <p-sortIcon field = "docDate"></p-sortIcon>
                                        </th>                                            
                                    </tr>
                                </ng-template>
                                <ng-template pTemplate = "body" let-doc>
                                    <tr>
                                        <td><a>{{ doc.number }}</a></td>
                                        <td>{{ doc.name }}</td>
                                        <td>{{ doc.type }}</td>
                                        <td>{{ doc.docNumber }}</td>
                                        <td>{{ doc.docDate }}</td>
                                    </tr>
                                </ng-template>
                            </p-table> 
                        </ng-template>                              
                    </p-accordionTab>                
                </p-accordion> 
            </ng-template>
            <ng-template pTemplate>
                <p-accordion [activeIndex] = "0" class = "w-100">
                    <p-accordionTab header = "Docusign Documents">
                        <div class = "flex justify-content-between">
                            <div>
                                <h6>Docusign Documents</h6>
                            </div>                                
                        </div>
                        <ng-template pTemplate>
                            <p-table [value] = "docusignDocumentList" styleClass = "p-3 p-datatable-striped">
                                <ng-template pTemplate = "header">
                                    <tr>                                            
                                        <th pSortableColumn = "name">Document Name
                                            <p-sortIcon field = "name"></p-sortIcon>
                                        </th>
                                        <th pSortableColumn = "number">Doc Id
                                            <p-sortIcon field = "number"></p-sortIcon>
                                        </th>                                                                                       
                                    </tr>
                                </ng-template>
                                <ng-template pTemplate = "body" let-doc>
                                    <tr>
                                        <td>{{ doc.name }}</td>                                            
                                        <td><a>{{ doc.number }}</a></td>
                                    </tr>
                                </ng-template>
                            </p-table> 
                        </ng-template> 
                        
                    </p-accordionTab>
                </p-accordion> 
            </ng-template>
        </p-splitter>
    </div>

Здесь мне нужно решить две проблемы:

  1. Как сделать размер всех аккордеонов одинаковым? Обратите внимание, что контент динамичен, и каждый аккордеон растет в соответствии со своим содержимым. Я хочу, чтобы все аккордеоны были одного размера. (Максимальный размер этих трех аккордеонов)
  2. Как сделать так, чтобы сплиттер не менял размер? В настоящее время пользователь может изменить размер разделителя. Если я хочу остановить это, как я могу этого добиться?

Спасибо за чтение и любая помощь будет принята с благодарностью!

С уважением,
Нитин Авула.

Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
2
0
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Обычно CSS компонента ограничен только внутри компонента. Мы можем использовать ::ng-deep, чтобы переопределить это поведение, и CSS будет виден за пределами компонента!

Как сделать размер всех аккордеонов одинаковым? Обратите внимание, что контент динамичен, и каждый аккордеон растет в соответствии со своим содержимым. Я хочу, чтобы все аккордеоны были одного размера. (Максимальный размер этих трех аккордеонов)

Я просто добавляю приведенный ниже CSS, чтобы убедиться, что полная высота распространяется на все элементы аккордеона. Я использую класс custom-accordion, чтобы гарантировать, что CSS ограничен самим аккордеоном!

HTML

...
<div class = "card w-full custom-accordion" [ngClass] = "{'no-resize': noResize}">
...

CSS

::ng-deep .custom-accordion .p-accordion-content {
    height: calc(100% - 54px) !important;
}

::ng-deep .custom-accordion .p-toggleable-content,
::ng-deep .custom-accordion .p-accordion-tab,
::ng-deep .custom-accordion p-accordiontab,
::ng-deep .custom-accordion .p-accordion {
    height:100% !important;
} 

Как сделать так, чтобы сплиттер не менял размер? В настоящее время пользователь может изменить размер разделителя. Если я хочу остановить это, как я могу этого добиться?

Я не уверен, зачем вам нужен элемент изменения размера. Если изменение размера не требуется, вы можете просто сделать то же самое с flexbox. Если вы хотите это сделать, вы можете использовать CSS из загрузочных сеток!

Чтобы добиться того, чего вы хотите, мы можем просто скрыть панель изменения размера с помощью класса p-splitter-gutter Я использую ту же концепцию, ограничивая ее до уровня аккордеона, используя класс no-resize

HTML

<button (click) = "noResize = !noResize">toggle Resize</button>
{{noResize}}
<div class = "card w-full custom-accordion" [ngClass] = "{'no-resize': noResize}">
...

CSS

/* disable the resize */
::ng-deep .no-resize .p-splitter-gutter {
    display: none !important;
}

ПОЛНЫЙ КОД

ТС

import { Component } from '@angular/core';
import { ImportsModule } from './imports';

@Component({
  selector: 'splitter-horizontal-demo',
  templateUrl: './splitter-horizontal-demo.html',
  standalone: true,
  imports: [ImportsModule],
  styles: [
    `
    ::ng-deep .custom-accordion .p-accordion-content {
        height: calc(100% - 54px) !important;
    }

    ::ng-deep .custom-accordion .p-toggleable-content,
    ::ng-deep .custom-accordion .p-accordion-tab,
    ::ng-deep .custom-accordion p-accordiontab,
    ::ng-deep .custom-accordion .p-accordion {
        height:100% !important;
    } 
    /* disable the resize */
    ::ng-deep .no-resize .p-splitter-gutter {
        display: none !important;
    }
  `,
  ],
})
export class SplitterHorizontalDemo {
  noResize = false;
  documentList = [
    { name: 'test' },
    { name: 'test1' },
    { name: 'test2' },
    { name: 'test3' },
    { name: 'test4' },
    { name: 'test5' },
    { name: 'test6' },
  ];
  paperDocumentList = [
    {
      number: 'test',
      name: 'test',
      type: 'test',
      docNumber: 'test',
      docDate: 'test',
    },
    {
      number: 'test',
      name: 'test',
      type: 'test',
      docNumber: 'test',
      docDate: 'test',
    },
    {
      number: 'test',
      name: 'test',
      type: 'test',
      docNumber: 'test',
      docDate: 'test',
    },
    {
      number: 'test',
      name: 'test',
      type: 'test',
      docNumber: 'test',
      docDate: 'test',
    },
  ];
  docusignDocumentList = [
    {
      name: 'test',
      number: 'test',
    },
  ];

  noAction(event: any) {
    event.preventDefault();
    return false;
  }
}

HTML

<button (click) = "noResize = !noResize">toggle Resize</button>
{{noResize}}
<div class = "card w-full custom-accordion" [ngClass] = "{'no-resize': noResize}">
  <p-splitter
    [panelSizes] = "[30, 40, 30]"
    styleClass = "mb-5"
    (onResizeEnd) = "noAction($event)"
    (onResizeStart) = "noAction($event)"
  >
    <ng-template pTemplate>
      <p-accordion [activeIndex] = "0" styleClass = "h-full">
        <p-accordionTab header = "Signed PDF Documents">
          <div class = "flex justify-content-between">
            <div>
              <h6>Proposal PDF Documents</h6>
            </div>
            <div><a>Add Attachment(s)</a></div>
          </div>
          <ng-template pTemplate>
            <p-table
              [value] = "documentList"
              styleClass = "p-3 p-datatable-striped"
            >
              <ng-template pTemplate = "header">
                <tr>
                  <th pSortableColumn = "name">
                    Attachment Name
                    <p-sortIcon field = "name"></p-sortIcon>
                  </th>
                </tr>
              </ng-template>
              <ng-template pTemplate = "body" let-doc>
                <tr>
                  <td><a>{{ doc.name }}</a></td>
                </tr>
              </ng-template>
            </p-table>
          </ng-template>
        </p-accordionTab>
      </p-accordion>
    </ng-template>
    <ng-template pTemplate>
      <p-accordion [activeIndex] = "0">
        <p-accordionTab header = "Papervision Documents">
          <div class = "flex justify-content-between">
            <div>
              <h6>Scanned Contract Documents</h6>
            </div>
          </div>
          <ng-template pTemplate>
            <p-table
              [value] = "paperDocumentList"
              styleClass = "p-3 p-datatable-striped"
            >
              <ng-template pTemplate = "header">
                <tr>
                  <th pSortableColumn = "number">
                    Customer Number
                    <p-sortIcon field = "number"></p-sortIcon>
                  </th>
                  <th pSortableColumn = "name">
                    Customer Name
                    <p-sortIcon field = "name"></p-sortIcon>
                  </th>
                  <th pSortableColumn = "type">
                    Doc Type
                    <p-sortIcon field = "type"></p-sortIcon>
                  </th>
                  <th pSortableColumn = "docNumber">
                    Doc Number
                    <p-sortIcon field = "docNumber"></p-sortIcon>
                  </th>
                  <th pSortableColumn = "docDate">
                    Doc Date
                    <p-sortIcon field = "docDate"></p-sortIcon>
                  </th>
                </tr>
              </ng-template>
              <ng-template pTemplate = "body" let-doc>
                <tr>
                  <td><a>{{ doc.number }}</a></td>
                  <td>{{ doc.name }}</td>
                  <td>{{ doc.type }}</td>
                  <td>{{ doc.docNumber }}</td>
                  <td>{{ doc.docDate }}</td>
                </tr>
              </ng-template>
            </p-table>
          </ng-template>
        </p-accordionTab>
      </p-accordion>
    </ng-template>
    <ng-template pTemplate>
      <p-accordion [activeIndex] = "0" class = "w-100">
        <p-accordionTab header = "Docusign Documents">
          <div class = "flex justify-content-between">
            <div>
              <h6>Docusign Documents</h6>
            </div>
          </div>
          <ng-template pTemplate>
            <p-table
              [value] = "docusignDocumentList"
              styleClass = "p-3 p-datatable-striped"
            >
              <ng-template pTemplate = "header">
                <tr>
                  <th pSortableColumn = "name">
                    Document Name
                    <p-sortIcon field = "name"></p-sortIcon>
                  </th>
                  <th pSortableColumn = "number">
                    Doc Id
                    <p-sortIcon field = "number"></p-sortIcon>
                  </th>
                </tr>
              </ng-template>
              <ng-template pTemplate = "body" let-doc>
                <tr>
                  <td>{{ doc.name }}</td>
                  <td><a>{{ doc.number }}</a></td>
                </tr>
              </ng-template>
            </p-table>
          </ng-template>
        </p-accordionTab>
      </p-accordion>
    </ng-template>
  </p-splitter>
</div>

Демо-версия Stackblitz

Привет. Спасибо за подробный ответ. Теперь это работает для меня. Но у меня есть проблема. Если я использую ваш подход CSS для установки размера аккордеона. Аккордеон закрыть и открыть не работает. Должен ли я использовать функции обратного вызова onClose и onOpen на аккордеоне, чтобы изменить класс CSS, чтобы он открывался и закрывался? Или вы предлагаете какой-то другой подход? Спасибо!

Nitin Avula 15.05.2024 17:21

@NitinAvula На самом деле в stackblitz все работает нормально :( возможно, проверьте CSS и посмотрите, какой реквизит вызывает это, а также попробуйте воспроизвести проблему в stackblitz, чтобы я мог это проверить, спасибо!

Naren Murali 15.05.2024 17:25

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