【问题标题】:Angular 2 ngModel and index with select elementAngular 2 ngModel 和带有选择元素的索引
【发布时间】:2017-05-20 16:24:36
【问题描述】:

我有一个像这样的 ng for 循环

<template ngFor let-game [ngForOf]="(games)" let-index="index">
    <tr>
        <td>
            <select [(ngModel)]="selectedPrice" class="form-control" name="">
                <option *ngFor="let price of prices">{{price}}</option>
            </select>
        </td>
        <td>
    </tr>
</template>

显然,更改一个元素的价格会更改所有其他元素的价格。

这是我的意思的一个分支,当你改变一个下拉菜单时,它会改变另一个。 https://plnkr.co/edit/LVViSdlgmY56RnO8mAU4?p=preview

我的问题是:有没有办法利用模板元素中的索引为每个生成的元素绑定一个 selectedPrice ?因此,当我更改一个下拉值的值时,它不会更改所有其他值的值

我尝试了某些语法,例如 [(ngModel)]="selectedPrice[index]",当我选择价格时,它并没有达到我想要的含义, selectedPrice[index] 实际上并不包含值。我还有其他一些可行的方法,但它们很老套。

【问题讨论】:

  • 澄清这一点不符合我的要求
  • 我澄清了我的意思并更新了我的问题

标签: angular ngfor angular2-ngmodel


【解决方案1】:

https://plnkr.co/edit/nOQ4ve9ee2A1TZjvrQBS?p=preview

//our root app component
import {Component, NgModule} from '@angular/core'
import {FormsModule} from '@angular/forms'
import {BrowserModule} from '@angular/platform-browser'

@Component({
  selector: 'my-app',
  template: `
      <tr *ngFor="let game of games; let i='index'">
        <td>
          {{game.name}} {{i}} {{game.price}}
        </td>
        <td>
            <select [(ngModel)]="games[i].price" class="form-control">
                <option *ngFor="let price of prices">{{price}}</option>
            </select>
        </td>
    </tr>
  `,
})
export class App {
  constructor() {}
  
  prices = ['40$', '30$', '20$'];
  games = [{name:'ge64'}, {name:'SM64'}];
  
}

@NgModule({
  imports: [ BrowserModule, FormsModule ],
  declarations: [ App ],
  bootstrap: [ App ]
})
export class AppModule {}

【讨论】:

    【解决方案2】:

    试试下面的代码。 selectedPrice 变量现在包含选定的值。

    @Component({
      selector: 'my-app',
      template: `
          <tr>
            <td>
              <select [(ngModel)]="selectedPrice" class="form-control" name="" (change)="select()">
                <option *ngFor="let price of prices">{{price}}</option>
              </select>
            </td>
          </tr>
        <input id="result">
      `,
    })
    
    export class App {
      constructor() {}
    
      prices = ['40$', '30$', '20$']
    
      select(){
         document.getElementById('result').value = this.selectedPrice;
         console.log(this.selectedPrice);
      }
    }
    

    Plunker code

    【讨论】:

    • 我已经尝试过了,虽然它有效,但有没有更简单的方法利用索引而不创建另一个输入值?
    • @Garuuk 这个方法更简单:plnkr.co/edit/vVYutQrTCu2wvZOnR4L6?p=preview
    • 我分叉了你的 plnkr 来告诉你我在说什么。 plnkr.co/edit/LVViSdlgmY56RnO8mAU4?p=preview - 当您更改一个下拉菜单时,请注意其他更改。我正在尝试得到它,所以只有一个变化
    • @Garuuk 你想把游戏名和价格一起改吗?
    猜你喜欢
    • 2018-06-11
    • 2016-06-23
    • 2016-03-29
    • 2023-03-06
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多