【问题标题】:How to Separate List Items into Components in Angular如何在 Angular 中将列表项拆分为组件
【发布时间】:2019-05-04 06:28:19
【问题描述】:

假设我正在创建一个典型的待办事项列表,其结构如下:

<ul>
    <li>Item 1 - description for item 1</li>
    <li>Item 2 - description for item 2</li>
    <!-- ... -->
</ul>

我希望列表和项目尽可能可重复使用,因此我可以将它们分成单独的组件:

todo-list.component.*

@Component({
    selector: "todo-list",
    templateUrl: "todo-list.component.html"
})
export class TodoListComponent { /* ... */ }
<ul>
    <li todo-list-item *ngFor="let item of items" [item]="item"></li>
</ul>

todo-list-item.component.*

@Component({
    selector: "li[todo-list-item]",
    templateUrl: "todo-list-item.component.html"
})
export class TodoListItemComponent { /* ... */ }
{{ item.title }} - {{ item.description }}

到目前为止,只要我坚持使用原生 HTML 元素(例如 ulli),一切都会正常工作。

但是,当我尝试使用 Angular 组件而不是原生元素(例如 mat-listmat-list-item)时会出现问题:

todo-list.component.*

<mat-list>
    <mat-list-item todo-list-item *ngFor="let item of items" [item]="item"></mat-list-item>
</mat-list>

todo-list-item.component.*

{{ item.title }} - {{ item.description }}

上面的 sn-ps 不起作用mat-list-item 不接受 item 并且现在还有两个与 mat-list-item[todo-list-item] 匹配的组件定义。

我可以这样做:

todo-list.component.*

<mat-list>
    <todo-list-item *ngFor="let item of items" [item]="item"></todo-list-item>
</mat-list>

todo-list-item.component.*

<mat-list-item>
    {{ item.title }} - {{ item.description }}
</mat-list-item>

但是现在结构不正确,它不会产生正确的样式:

<mat-list>
    <todo-list-item>
        <mat-list-item>Item 1 - description for item 1</mat-list-item>
    </todo-list-item>
    <todo-list-item>
        <mat-list-item>Item 2 - description for item 2</mat-list-item>
    </todo-list-item>
</mat-list>

mat-list-item应该直接在mat-list下:

<mat-list>
    <mat-list-item>Item 1 - description for item 1</mat-list-item>
    <mat-list-item>Item 2 - description for item 2</mat-list-item>
</mat-list>

我知道我可以将这两个组件组合成一个组件,但是每个列表项都可能相当复杂(带有按钮和附加逻辑),我希望它们位于单独的组件中。解决这个问题的常用方法是什么?我可以找到的许多相关问题(例如thisthis)都假设使用了本机元素,但此处并非如此。具体来说,如何使用我自己定义的两个组件创建以下结构?

<todo-list>
    <mat-list>
        <mat-list-item>Item 1 - description for item 1</mat-list-item>
        <mat-list-item>Item 2 - description for item 2</mat-list-item>
    </mat-list>
</todo-list>

【问题讨论】:

  • 当你说mat-list-item 不接受item 你到底是什么意思?
  • @fuzz mat-list-item 是一个已经定义的 Angular 组件,而不是我可以使用选择器重新定义的原生 HTML 元素。因此,我无法控制它的输入。
  • 样式设置到底是如何关闭的
  • @NikolaiKiefer 我们只是说结构需要精确到mat-list-item 必须直接位于mat-list 之下。样式不正确只是结构不正确造成的副作用。
  • 能否提供样式截图

标签: javascript angular


【解决方案1】:

tod​​o-list.component.*

<mat-list>
    <todo-list-item *ngFor="let item of items" [item]="item"></todo-list-item>
</mat-list>

tod​​o-list-item.component.*

<mat-list-item>
    {{ item.title }} - {{ item.description }}
</mat-list-item>

你的例子看起来很有希望

你试过了

<mat-list>
   <mat-list-item *ngFor="let item of items" >
     <todo-list-item [item]></todo-list-item>
   </mat-list-item>
</mat-list>

tod​​o-list-item.component.*

    <p>{{ item.title }} - {{ item.description }}</p>

这样它应该被隔离在 mat list 下的 mat list 项

【讨论】:

  • 您确定吗,因为您的示例中的 ngfor 不同
  • 很抱歉。再次阅读后,我注意到您已将*ngFor 向上移动到mat-list。这将为每个items 创建一个单独的mat-list,这也是不正确的。
  • 我尝试了一些选项,如果编辑对您有用,请告诉我。或者你的逻辑有问题吗
猜你喜欢
  • 2021-11-07
  • 2014-06-08
  • 2019-10-20
  • 2012-12-23
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-19
相关资源
最近更新 更多