如何在组件中重用有角度的材料表标题和样式?

如何解决如何在组件中重用有角度的材料表标题和样式?

我正在创建一个带有 angular 的站点,其中我有多个具有不同列的表。例如,一个表格显示带有复选框的东西,其他带有文本等等。但它们都共享相同的样式、标题和容器。

所以我的第一次尝试是使用以下 html 创建一个新组件:

<div class="component-container">

    <ng-container *ngIf="isLoadingResults">
        <app-loading-spinner></app-loading-spinner>
    </ng-container>

    <div class="table-container">
        <table mat-table [dataSource]="dataSource">

            <!--- Note that these columns can be defined in any order.
                The actual rendered columns are set as a property on the row definition" -->
            
            <ng-content></ng-content>
            
            <tr mat-header-row *matHeaderRowDef="displayedColumns; sticky:true"></tr>
            <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>

            <!-- Empty dataset -->
            <tr class="mat-row" *matNoDataRow [ngClass]="{'empty-dataset__hidden': isLoadingResults}" class="empty-dataset">
                <td class="mat-cell" [colSpan]="displayedColumns.length">
                    <ng-container *ngIf="!errorLoadingResults">
                        <div class="empty-dataset__no_content">
                            <span>
                                {{emptyDatasetText ? emptyDatasetText : ""}}
                            </span>
                        </div>
                    </ng-container>
                    <ng-container *ngIf="errorLoadingResults">
                        <div class="empty-dataset__error">
                            <span >
                                {{errorGettingDatasetText ? errorGettingDatasetText : ""}}
                            </span>
                        </div>
                    </ng-container>
                </td>
            </tr>
        </table>
    </div>
</div>

而且我希望能够在 ng-content 中注入我的列:

<app-table-setting 
            [dataSource]="categories"
            [displayedColumns]="displayedColumns"
            [isLoadingResults]="isLoadingResults"
            emptyDatasetText="No categories found."
            errorGettingDatasetText="There was an error getting the categories."
            >

            <!-- ID Column -->
            <ng-container matColumnDef="id">
                <th mat-header-cell *matHeaderCellDef> ID </th>
                <td mat-cell *matCellDef="let element"> 
                    <span class="mobile-label">ID: </span>
                    {{element.id}} 
                </td>
                <span class="mobile-label">ID: </span>
            </ng-container>

            <!-- Name Column -->
            <ng-container matColumnDef="name">
                <th mat-header-cell *matHeaderCellDef> Name </th>
                <td mat-cell *matCellDef="let element">
                    <span class="mobile-label">Name: </span>
                    {{element.name}}  
                    <div *ngIf="element.parentCategory">
                        <span class='subtitle'><span>{{element.categoryName}}</span></span>
                    </div>
                </td>
            </ng-container>

            <!-- Description Column -->
            <ng-container matColumnDef="description">
                <th mat-header-cell *matHeaderCellDef> Description </th>
                <td mat-cell *matCellDef="let element"> 
                    <span class="mobile-label">Description: </span>
                    {{element.description}} 
                </td>
            </ng-container>

            <!-- Symbol color -->
            <ng-container matColumnDef="color">
            <th mat-header-cell *matHeaderCellDef> Color </th>
                <td mat-cell *matCellDef="let element">  
                    <span class="mobile-label">Color: </span>
                    <mat-icon [ngStyle]="{'color': element.color}" class="icon">stop</mat-icon> 
                </td>
            </ng-container>      

            <!-- Actions -->
            <ng-container matColumnDef="actions">
                <th mat-header-cell *matHeaderCellDef> Actions </th>
                <td mat-cell *matCellDef="let element"> 
                    <span class="mobile-label">Actions: </span>    
                    <div >
                        <button mat-icon-button color="accent" id="{{'edit:' + element.id}}">
                            <mat-icon  class="icon" aria-label="Edit" (click)="onEditCategory(element.id)">edit</mat-icon>
                        </button>
                        <button mat-icon-button color="accent" id="{{'delete:' + element.id}}">
                            <mat-icon class="icon" (click)="onDeleteCategory(element.id,element.name)">delete</mat-icon>
                        </button>
                    </div>
                </td>
            </ng-container>
                                
        </app-table-setting>

是否有可能以可重用的方式获取该 html 而不会为每个组件复制它?

更新:为避免误解:

我有 n 个这样的组件:

Component 1

table + styling
-> columns (with different bindings and actions,not just text)
-> Some default errors/warnings with empty table

我想要这个:

Component 1

table + styling
<ng-content>
-> Some default errors/warnings with empty table

component n

<app-component-1>
-> columns (with different bindings and actions,not just text)
</app-component-1>

Update2:我是第一次在 stackblitz 中创建项目,所以我希望每个人都可以访问。我有一个示例,如果我尝试在调用组件中放置一列 postion 列,第一个无法识别它。我想知道如何将其拆分为两个部分: https://stackblitz.com/edit/angular-multi-component-table?file=src/app/app.component.html

解决方法

您需要具有不同列的同一个表,因此您需要动态传递显示列并且表仅呈现这些列。此外,您可以根据需要操作数据源和传递。我为您制作了一个演示。

stackblitz

,

您可以按照以下模式将表格封装到具有属性和样式的组件中。

  1. 创建一个新组件,比如 TableSettingsComponent。
  2. 将 SCSS 样式复制到样式表文件 table-settings.component.scss 中。
  3. 将您的 HTML 表格复制到 HTML 文件 table-settings.component.html 中。

实现包含属性访问器和设置器的组件。

@Component({
  selector: 'app-table-settings',templateUrl: './table-settings.component.html',styleUrls: ['./table-settings.component.scss']
})
export class TableSettingsComponent implements OnInit {

  _dynamicColumns: any;

  @Input("_dynamicColumns")
  set _dynamicColumns(value: any) 
  { 
      this._dynamicColumns = value; 
  }

  get dynamicColumns() { return this._dynamicColumns; }
  ...

}

在您的应用模块中,如下所示声明您的组件:

import { TableSettingsComponent } from '../components/table-settings.component.html';


@NgModule({
  declarations: [
    ...
    PaginationComponent,...
  ],imports: [
    ...
  ],exports: 
  [
    ...
    PaginationComponent,...
  ]
})
export class AppModule { }

您现在应该能够在您的应用程序中重新使用包含在另一个主机(父)组件中的新(子)组件。例如,在应用程序根组件中,我们定义将用作子表设置组件的输入的列变量。在下面的示例中,我定义了一个字符串数组来保存列名:

@Component({
  selector: 'app-root',templateUrl: './app.component.html',styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit {
  _columnsValue: string[];

  get columnsValue() { return this._columnsValue; }

  ngOnInit()
  {
      _columnsValue = ['Column1','Column2','Column3']; 
  }  
  ...
}

在父组件的 HTML (app.component.html) 中,重新使用上述组件,如下所示,将值传递给您的表组件列属性,如下所示:

<app-table-settings [dynamicColumns]="columnsValue">
</app-table-settings>

这只是一个可以扩展的基本结构。 您可以使用应用中的任何其他组件来托管新组件。

请尝试看看效果如何。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res