【问题标题】:Expand/Collapse functionality between components组件之间的展开/折叠功能
【发布时间】:2023-03-10 21:22:01
【问题描述】:

我有 2 个不同的组件,我在其中使用 Angular - 扩展面板来扩展摘要视图。

我能够成功地将<mat-expansion-panel> 集成到各个组件中。

我需要帮助以使 Component2.html 成为 Component1.html 的父级(在扩展内展开 - 请参见下图)

  • 组件 1 应该能够独立展开和折叠以显示数据

  • 组件 2 应该在自身内嵌入组件 1,所以当Component 1 is expanded it can show its data and display remaining Child components

注意 - 两个组件都有兄弟关系no parent childchild - parent

Component1.html

  <div class="row">
    <div class>
      <dl class="row property_set" data-property-set-name="data">
        <mat-accordion>
          <mat-expansion-panel (opened)="doExpand = true"
                             (closed)="doExpand = false">
          <mat-expansion-panel-header>
            <mat-panel-title>
        <dt class="col-sm-4 record_property">data</dt>
      </mat-panel-title>
      <mat-panel-description>
        <dd class="col-sm-8 record_property_value data_name" id="{{genId(data.name)}}">
          <inline-misal-edit 
                        [(field)]="data.name" [elementType]="a.bName" (fieldChange)="dataModified(data)"
                        cols="30" rows="1"></inline-misal-edit>
          </dd>
      </mat-panel-description>
    </mat-expansion-panel-header>

        <dt class="col-sm-4 record_property">news</dt>
        <dd class="col-sm-8 record_property_value">{{data.news?.created | news}}</dd>
      </mat-expansion-panel>
    </mat-accordion>
      </dl>
    </div>

Component2.html


  <dl class="row property_set" data-property-set-name="misal">
    <mat-accordion>
        <mat-expansion-panel (opened)="doExpand = true"
                             (closed)="doExpand = false">
          <mat-expansion-panel-header>
            <mat-panel-title>
              misal Id
            </mat-panel-title>
            <mat-panel-description>
              <dd class="col-sm-10 record_property_value" data-property-type="select">{{misal.id || 'new'}}</dd>
            </mat-panel-description>
          </mat-expansion-panel-header>
          <dd class="col-sm-10 record_property_value misal_name">{{misal.data[0].name}}</dd>
          <dt class="col-sm-2 record_property">Country Pass</dt>
          <dt class="col-sm-2 record_property">Plugins Program</dt>
          <dd class="col-sm-10 record_property_value">
            <north-dhamma[(misal)]="misal" [editMode]="editMode" (misalChange)="recordModified.emit()"></registry-number>
          </dd>
          <dt *ngIf="misal.value === 'hovered'" class="col-sm-2 record_property">Related Plugins Program</dt>
          <dd *ngIf="misal.value === 'hovered'" class="col-sm-10 record_property_value">
            <land-hole></land-hole>
          </dd>
                </mat-expansion-panel>
      </mat-accordion>
  </dl>

.ts 文件

  panelOpenState = true;                 

更新

Robbie 下面给出的答案适用于parent - child component relation ,但不适用于sibling component

【问题讨论】:

标签: angular angular-material parent-child mat-expansion-panel


【解决方案1】:

一种方法是使用共享服务 - https://angular.io/guide/component-interaction#parent-and-children-communicate-via-a-service

但是我发现以下解决方案更简单,它允许在 2 个兄弟姐妹之间共享数据。

app-sibling2.component.ts

import { AppSibling1Component } from '../app-sibling1/app-sibling1.component';

export class AppSibling2Component {
   @Input() data: AppSibling1Component;
   ...
}

在你的父组件模板中:

<!-- Assigns "AppSibling1Component" instance to variable "data" -->
<app-sibling1 #data></app-sibling1>
<!-- Passes the variable "data" to AppSibling2Component instance -->
<app-sibling2 [data]="data"></app-sibling2> 

我相信这就是您正在寻找的。如果您有任何问题,请告诉我

【讨论】:

    【解决方案2】:

    您应该能够在mat-expansion-panel-header 的结束标记之后添加您的子组件

    <mat-accordion>
      <mat-expansion-panel>
        <mat-expansion-panel-header>
          <mat-panel-title>
            Parent Expansion
          </mat-panel-title>
        </mat-expansion-panel-header>
        <p>Content of parent</p>
        <!-- add child here -->
        <app-child></app-child>
      </mat-expansion-panel>
    </mat-accordion>
    

    https://stackblitz.com/edit/angular-5euuwx?file=src%2Fapp%2Fexpansion-overview-example.html

    【讨论】:

    • 感谢您的回答,我提到我项目中的2 components(they are side-by-side, SIBLINGS) 无关。他们是分开的,他们do not have parent to child or child 2 parent relation。你能帮我解决这个问题吗?
    【解决方案3】:

    我有点困惑,你想让Component2.html 作为Component1.html 的父级,并且你提到这两个组件都有兄弟关系,no parent child or child - parent

    记住这一点,如果 ExpansionWrapperComponent 包含 Component1Component2 并包含行为 - 如果 Component2 被切换 Component1 必须同时切换 @987654330 @也可以单独切换

    expansion-wrapper.component.html

    <div class="expansion-wrapper">
      <div class="parent">
        <ng-content select="app-component2"></ng-content>
      </div>
      <div class="child">
        <ng-content select="app-component1"></ng-content>
      </div>
    </div>
    

    expansion-wrapper.component.ts

    import { AfterContentInit, Component, ContentChild, OnInit } from '@angular/core';
    import { Component1Component } from '../component1/component1.component';
    import { Component2Component } from '../component2/component2.component';
    
    @Component({
      selector: 'app-expansion-wrapper',
      templateUrl: './expansion-wrapper.component.html',
      styleUrls: ['./expansion-wrapper.component.css']
    })
    export class ExpansionWrapperComponent implements OnInit, AfterContentInit {
    
      @ContentChild(Component2Component, { static: false }) component2: Component2Component;
      
      @ContentChild(Component1Component, { static: false }) component1: Component1Component;
    
      constructor() { }
    
      ngOnInit() {
      }
    
      ngAfterContentInit() {
        this.component2.panelStateChanged.subscribe(res => {
          this.component1.togglePanelState(res);
        });
      }
    
    }
    

    其中Component1Component2 包含单独的扩展面板。这个Component1Component2 的兄弟,感觉就像嵌入到Component2 中。

    通过stackblitz查看申请

    【讨论】:

      【解决方案4】:

      我对您的需求感到困惑。

      组件 2 应将组件 1 嵌入到自身中

      你需要的是这样的

      // component2.component.ts
      @Component({
        selector: "component2",
        template: `
          <component1></component1>
        `,
        styles: []
      })
      export class Component2 {
      }
      

      两个组件都有兄弟关系,没有父子或子-父

      但是在这里,你想要这个。

      // app.component.ts
      @Component({
        selector: "app",
        template: `
          <component2></component2>
          <component1></component1>
        `,
        styles: []
      })
      export class AppComponent {
      }
      

      我猜你想要的是这样的东西,demo。 2兄弟&lt;mat-expansion-panel&gt;作为显示单元。

      【讨论】:

        猜你喜欢
        • 2012-08-31
        • 2018-03-05
        • 2023-04-06
        • 1970-01-01
        • 2011-10-12
        • 2017-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多