Angular 为数据网格创建 sub-components 的清晰度

Angular Clarity creating sub-components for datagrid

我正在使用 Clarity 的数据网格并希望构建更小的组件以遵循此结构:

这是我的网格组件模板:

<clr-datagrid>
    <app-grid-header></app-grid-header>

    <app-grid-item *ngFor="let city of cities$ | async" [city]="city"></app-grid-item>

    <clr-dg-footer>{{(cities$ | async).length}} cities</clr-dg-footer>
</clr-datagrid>

那是我的网格 header:

import { Component } from '@angular/core';

@Component({
    selector: 'app-grid-header',
    template: `
        <clr-dg-column>City</clr-dg-column>
        <clr-dg-column>Capital</clr-dg-column>
        <clr-dg-column>Population</clr-dg-column>
        <clr-dg-column>Country</clr-dg-column>
    `
})
export class GridHeaderComponent {}

这是我的网格项目:

import { Component, Input } from '@angular/core';
import { City } from '../city.model';

@Component({
    selector: 'app-grid-item',
    template: `
        <clr-dg-row>
            <clr-dg-cell>{{city.name}}</clr-dg-cell>
            <clr-dg-cell>{{city.capital}}</clr-dg-cell>
            <clr-dg-cell>{{city.population}}</clr-dg-cell>
            <clr-dg-cell>{{city.country.name}}</clr-dg-cell>
        </clr-dg-row>
    `
})
export class GridItemComponent {
    @Input()
    city: City;
}

但是,如果我这样做,网格就会乱七八糟:

如果我去掉专用的哑组件并内联所有内容,网格看起来会如预期的那样:

<clr-datagrid>
    <clr-dg-column>City</clr-dg-column>
    <clr-dg-column>Capital</clr-dg-column>
    <clr-dg-column>Population</clr-dg-column>
    <clr-dg-column>Country</clr-dg-column>

    <clr-dg-row *ngFor="let city of cities$ | async">
        <clr-dg-cell>{{city.name}}</clr-dg-cell>
        <clr-dg-cell>{{city.capital}}</clr-dg-cell>
        <clr-dg-cell>{{city.population}}</clr-dg-cell>
        <clr-dg-cell>{{city.country.name}}</clr-dg-cell>
    </clr-dg-row>

    <clr-dg-footer>{{(cities$ | async).length}} cities</clr-dg-footer>
</clr-datagrid>

我找不到解决此类问题的方法。

我尝试将 app-grid-header 模板更改为 [app-grid-header] 并将其用作指令 <div app-grid-header></div> 但这并没有解决问题。

我也尝试将 encapsulation 更改为其他可能的选项,其中 none 产生了影响。

我必须做出什么改变才能使这项工作按预期进行?

当您插入自己的组件而不是典型的数据网格组件时,问题就会出现,用于显示内容的选择器并不总是能正常工作。这是 Angular 一般工作方式的限制,可以把它想象成不匹配的 CSS 选择器。这与封装模式无关,因为它只影响 Angular 组件中声明的 CSS 而 Clarity 不使用它。

但是,您可以在一定程度上做到这一点,您可以使用 clr-dg-row 类型数据做到这一点。请参阅此演示:https://stackblitz.com/edit/clarity-datagrid-nested-row-7xxlq8?file=app%2Fapp.component.html

一般来说,最好不要将数据网格分解成更小的组件,尤其是在这个示例中,这会导致您拥有比不分解(通过添加更多组件)更多的代码。在许多情况下,这是过度优化到您有更多开销的程度。如果您有需要重用的数据网格,请将整个数据网格包装到一个组件中。

编辑:从 Clarity 1.0 开始,这可能行不通,不建议尝试在数据网格内换行。出现了许多冲突,换行并没有太多好处。