【问题标题】:table, thead and tbody component breaks the layout of the table when assemble togethertable、thead 和 tbody 组件组合在一起时会破坏 table 的布局
【发布时间】:2019-11-27 06:07:02
【问题描述】:

当我在父页面中分别为 tabletheadtbody 创建组件时,表格完全崩溃了。

不知道怎么解决。

表格组件:

<table>
    <ng-content></ng-content>
</table> 

头组件:

<thead>
  <tr>
    <th>Someple header</th>
    <th>Someple header</th>
  </tr>
</thead>

tbody 组件:

<tbody>
  <tr>
    <td>sample data1</td>
    <td>sample data2</td>
  </tr>
</tbody>

放在一起时:

<app-table>
  <app-thead></app-thead>
  <app-tbody></app-tbody>
</app-table>

但它打破了桌子。全部排列为内联元素。如何解决?

Live URL please resize window

【问题讨论】:

  • 如果您检查 html 结果,您可以看到:&lt;body&gt; &lt;my-app&gt; &lt;app-table&gt; &lt;table&gt; &lt;app-thead&gt; &lt;thead&gt;...&lt;/thead&gt; &lt;/app-thead&gt; &lt;app-tbody&gt; &lt;tbody&gt;...&lt;/tbody&gt; &lt;/app-tbody&gt; &lt;/table&gt; &lt;/app-table&gt; &lt;/my-app&gt; &lt;/body&gt; 作为解决方案,我建议您使用 TemplateRef
  • @Myugen - 你能分享一个关于 templateRef 的示例或教程吗?在这种情况下如何处理?
  • 这个问题在这里解决了:stackoverflow.com/questions/43631813/…
  • @3gwebtrain 与普通的&lt;table&gt; 相比,您究竟想用这个&lt;app-table&gt; 实现什么?
  • @Taurayi - 通过分别传递标头数组和正文数组创建动态表,并要求保留多个值的转租

标签: angular angular8


【解决方案1】:

如果我了解您要做什么,我认为您只需用 &lt;ng-content&gt;&lt;/ng-content&gt; 标记替换您的 TableComponentTheadComponentTbodyComponent 组件的 html。然后,您将使用:host 选择器分别将&lt;app-table&gt;&lt;app-thead&gt;&lt;app-tbody&gt; 上的显示属性设置为tabletable-header-grouptable-row-group。代码如下所示:

import { BrowserModule } from '@angular/platform-browser';
import { NgModule, Component } from '@angular/core';


@Component({
  selector: 'app-table',
  template: `<ng-content></ng-content>`,
  styles: [`:host { display:table; }`]
})
export class TableComponent {}


@Component({
  selector: 'app-thead',
  template: `<ng-content></ng-content>`,
  styles: [`:host { display:table-header-group; }`]
})
export class TheadComponent {}


@Component({
  selector: 'app-tbody',
  template: `<ng-content></ng-content>`,
  styles: [`:host { display:table-row-group; }`]
})
export class TbodyComponent {}


@Component({
  selector: 'app-root',
  template: `
      <app-table>
        <app-thead>Thead</app-thead>
        <app-tbody>Tbody</app-tbody>
      </app-table>
  `
})
export class AppComponent {}


@NgModule({
  declarations: [
    AppComponent, 
    TableComponent, 
    TheadComponent,
    TbodyComponent
  ],
  imports: [
    BrowserModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

然后代码会输出如下:

<app-table>
  <app-thead>Thead</app-thead>
  <app-tbody>Tbody</app-tbody>
</app-table>

【讨论】:

    【解决方案2】:

    如果你检查表格元素,你会看到它是这样渲染的

    <table>
      <app-thead>...</app-thead>
      <app-tbody>...</app-tbody>
    </table> 
    

    这本身不是一个有效的 HTML。 tbody / thead 除了table 之外,您不能有任何其他包装器。这就是为什么你的桌子坏了,它除了 tbody 而是得到 app-tbody 并且不知道如何处理它。我建议不要为表格的主体和头部创建单独的组件,或者如果你真的必须这样做,你可以这样:

    解决方法: 使用属性选择器

    在您的app-tableapp-theadapp-tbody 组件中,将选择器转换为属性选择器。

    @Component({
      selector: '[app-table]'
      ...
    })
    

    在所有地方都这样做之后,您将像这样加载您的自定义表格:

    <table app-table>
      <thead app-thead></thead>
      <tbody app-tbody></tbody>
    </table>
    

    还要确保从您的自定义组件中删除 &lt;table&gt;&lt;tbody&gt;&lt;thead&gt; 包装器。

    StackBlitz

    【讨论】:

    • 解决方法是什么?在我的应用程序中,我没有表格,我想在这里节省时间..
    • 嘿,伙计们,也许在这里可以使用不同的方法。看看@angular/component 家伙在他们的日期选择器的这个特定部分做了什么(看看mat-calendar-body 组件 - 是的,它不仅仅是一个指令,它为组件带来了正文视图):github.com/angular/components/blob/master/src/material/…跨度>
    • @3gwebtrain 请再次检查,我已经更新了更好的解决方案。还提供了stackblitz
    • @Dino - 它可以工作,但我如何将数据传递给attrb 组件?
    • 和以前一样。使用@Input
    猜你喜欢
    • 2011-04-30
    • 2012-10-06
    • 1970-01-01
    • 2018-05-23
    • 2014-05-01
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 2011-02-08
    相关资源
    最近更新 更多