将每个数组元素绑定到选项标签

Posted

技术标签:

【中文标题】将每个数组元素绑定到选项标签【英文标题】:Bind each array element to option tag 【发布时间】:2016-11-22 09:45:19 【问题描述】:

我正在尝试将一个数组元素从一个类绑定到一个选项标签。

在 angular.io“英雄之旅”教程 (https://angular.io/docs/ts/latest/tutorial/toh-pt2.html) 中,他们为列表执行以下操作:

  <li *ngFor="let hero of heroes"
    (click)="onSelect(hero)">
    <span class="badge">hero.id</span> hero.name
  </li>

如果我理解正确 *ngFor="let hero of hero" 会将每个英雄(因此英雄数组中的每个元素)关联到一个 li 元素,然后显示关联的一些特征例如 hero.id 的英雄。

我说关联是因为如果它只是一个带有打印的简单循环,我看不出他们在使用 onSelect(hero) 之后如何取回英雄对象。

我一直在尝试对选项做同样的事情:

   <option *ngFor="let perso of persos">
     <span>perso.id : </span> perso.nom
   </option>

但是

(click)="onSelect(hero)"

无效,因为点击事件不会被选项触发。我找不到合适的触发器。非常欢迎任何帮助和补充信息。

【问题讨论】:

【参考方案1】:

对于那些原生的 HTML 元素,Angular 2 提供了双向绑定,所以你可以直接用ngModel 绑定你的值——这适用于所有的输入标签。因此,如果您手动更改选择,它也会使用当前值更新该变量。此外,如果您以编程方式更改 selectedPerso,则视图将使用新选择进行更新。

<select [(ngModel)]="selectedPerso" (change)="onChange($event)">
    <option *ngFor="let perso of persos" [value]="perso.id">
        <span>perso.id : </span> perso.nom
    </option>
</select>

在您的组件类主体中,您使用在页面加载时预先选择的默认值定义该绑定变量:

selectedPerso: number = persos[0].id;

onChange(event) 
    console.log("Selection changed: ", event);

【讨论】:

难道 [(ngModel)]="selectedPerso" 和 (change)="onChange($event)" 是多余的吗? 是的,我假设您想在更改时执行一些代码。【参考方案2】:

您不能将对象绑定到option 元素的[value] 属性。

我会将对象的 id 绑定到 option 元素的 [value] 属性并使用 select(change) 事件。

请看下面的例子:

import  Component  from '@angular/core';

@Component(
  selector: 'my-app',
  template: `
    Select your favorite serie:

    <select (change)="onChange($event.target.value)">
      <option *ngFor="let serie of series" [value]="serie.id"> serie.name </option>
    </select>

    <br />
    <br />

    Selected Serie: <br />
    <span *ngIf="selectedSerie">
       selectedSerie.id   -  selectedSerie.name 
    </span>
  `
)
export class AppComponent 

  private series: any[];
  private selectedSerie: any;

  constructor() 
    this.series = [
       id: 1, name: 'Friends' ,
       id: 2, name: 'How I met Your Mother' ,
       id: 3, name: 'Modenr Family' 
    ];

    this.selectedSerie = this.series[0];
  

  onChange(serieId: any): void 
    this.selectedSerie = this.series.find(serie => serie.id == serieId);
  

在此处查看完整示例:http://plnkr.co/edit/OOYx3LiN1pO3qffKn7lq

【讨论】:

以上是关于将每个数组元素绑定到选项标签的主要内容,如果未能解决你的问题,请参考以下文章

二维数组a[11][11]数组元素个数

将多个数组的每一项平均到一个数组中

C++怎样将一个数插入到数组末尾?

计算数组中每个数左边/右边第一个比其大/小的值

SwiftUI 将数组的元素作为绑定传递给子视图

将数组3,7,1,6,2,4,8,5中的元素从大到小的顺序排列,每次可以任意交换两个元素,求最少的交换次数。