我在尝试使用Angular Material时遇到了很多困难,特别是在选择列表方面。我正在Angular材料选择列表中显示对象列表,我想从所选项目列表中获取对象。
这是我到目前为止所做的,但[value]="row"
只是在我致电true
时给了我rows.selectedOptions.selected[0].value
:
submit(rows) {
console.log(rows);
console.log(rows.selectedOptions.selected[0].value);
console.log(rows.selectedOptions.selected[0]._getHostElement().innerText); // ugly hack, but at least it gives me the text of the option
}
<md-selection-list #rows dense>
<md-list-option *ngFor="let row of config.data" [value]="row">
{{row.title}}
</md-list-option>
</md-selection-list>
<div class="d-flex justify-content-end">
<div class="p-2">
<button md-button (click)="submit(rows)">
<span>Submit</span>
<md-icon aria-label="submit">arrow_forward</md-icon>
</button>
</div>
</div>
如何从所选选项列表中获取实际row
?
答案 0 :(得分:2)
查看API文档:https://material.angular.io/components/list/api
@Output()selectChange:
选择该选项时发出。
所以我想用
<md-selection-list #rows dense>
<md-list-option *ngFor="let row of config.data" (selectChange)="onSelectOptionChange($event)">
{{row.title}}
</md-list-option>
</md-selection-list>
将为您提供TypeScript端所需的数据:
onSelectOptionChange(value: any) {
console.log(value);
}
未经测试,但应该可行。 (没有,&#39; T )
编辑:我一直在使用plunkr进行一些测试,这是我的结果:
为免费笑声提供了Plunkr: https://plnkr.co/edit/1G3bgJ2Twue0RH7CGmK2?p=preview
我一直使用您提供的相同代码:
<md-selection-list #rows dense>
<md-list-option *ngFor="let row of config.data"
(selectChange)="onSelectChange($event)"
(deselected)="onDeselected($event)"
[checkboxPosition]="after"
[value]="[testValue]"
[selected]="[testValue]">
{{row.title}}
</md-list-option>
</md-selection-list>
<div class="d-flex justify-content-end">
<div class="p-2">
<button md-button (click)="submit(rows)">
<span>Submit</span>
<md-icon aria-label="submit">arrow_forward</md-icon>
</button>
</div>
</div>
这是我用于测试的TypeScript
export class App {
testValue: true;
config = {
data: [
{
title: 'Title1',
},
{
title: 'Title2',
},
{
title: 'Title3',
},
{
title: 'Title4',
}
]
}
constructor() {
}
onDeselected(value: any) {
console.log('deselected event => ', value);
}
onSelectChange(value: any) {
console.log('change => ', value);
}
submit(rows) {
console.log(rows.selectedOptions.selected.map(elements => {
return elements._getHostElement().innerText;
}));
}
}
结果:
value
是没用的:它会为option-list-item设置一个值,该值不用于任何内容。selected
有点无用:它在渲染时有效,但在示例中我将它们设置为true
,如果我立即提交,则不会得到任何结果({{ 1}}是一个空数组。)rows.selectedOptions.selected
输出事件无效。selectChange
输出事件无效。deselected
@Input()checkboxPosition:标签是否应出现在复选框之前或之后。默认为&#39;在&#39;之后。 不,在&#39;之前默认为&#39; !强>
如何从所选选项列表中获取实际
console.log(rows.selectedOptions.selected.map(elements => { return elements._getHostElement().innerText; }));
?
结论:你不能完全垃圾:不要使用它......
答案 1 :(得分:2)
你可以用以下方式处理它:
在你的component.ts中:
rows: Array<string> = []; //explicitly define and init property here
toggleRow(value:string){
if(this.rows.indexOf(value) !== -1){
this.rows.splice(this.rows.indexOf(value), 1);
}else{
this.rows.push(value);
}
}
submit(rows) {
console.log(rows);
}
和你的component.html:
<md-selection-list #rows dense>
<md-list-option *ngFor="let row of config.data" (click)="toggleRow(row.title)">
{{row.title}}
</md-list-option>
</md-selection-list>
<div class="d-flex justify-content-end">
<div class="p-2">
<button md-button (click)="submit(rows)">
<span>Submit</span>
<md-icon aria-label="submit">arrow_forward</md-icon>
</button>
</div>
</div>
您还可以使用Array<any>
或类似的.push()
整个row
对象加入rows
数组(而不仅仅是.title
)。 。
答案 2 :(得分:0)
我遇到了无法从MdListOption中提取值的问题。 我最终使用了那种破坏目的的解决方法,但仍然:
<md-selection-list #rows dense>
<md-list-option *ngFor="let row of config.data" (click)="clickedOnRow(row)">
{{row.title}}
</md-list-option>
</md-selection-list>
然后在组件中的clickedOnRow()中跟踪我的选择。
答案 3 :(得分:0)
我在角度5中遇到了同样的问题。我最终使用了SelectionModel并绑定了一个点击事件
<mat-selection-list #AnswerableBaseline>
<mat-list-option *ngFor="let a of dataSourceForAnswerable" (click)="onAnswerableBaselineListClicked(a)" checkboxPosition="before">
</mat-list-option>
</mat-selection-list>
ts档
selectionBaseline = new SelectionModel<Your Type>(true, []);
onAnswerableBaselineListClicked(row: any) {
if (!this.selectionBaseline.isSelected(row)) {
this.selectionBaseline.select(row);
}
else {
this.selectionBaseline.deselect(row);
}
}