【发布时间】: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 元素(例如 ul 和 li),一切都会正常工作。
但是,当我尝试使用 Angular 组件而不是原生元素(例如 mat-list 和 mat-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>
我知道我可以将这两个组件组合成一个组件,但是每个列表项都可能相当复杂(带有按钮和附加逻辑),我希望它们位于单独的组件中。解决这个问题的常用方法是什么?我可以找到的许多相关问题(例如this 和this)都假设使用了本机元素,但此处并非如此。具体来说,如何使用我自己定义的两个组件创建以下结构?
<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