【问题标题】:In Angular 2, How do I send Checkbox Values to my function in the component?在 Angular 2 中,如何将复选框值发送到组件中的函数?
【发布时间】:2017-10-03 02:42:08
【问题描述】:

我是 Angular 的新手并使用 NgFor,我正在显示要选择它们的元素,单击后我应该在 Component 函数中获取 ID。 但我尝试使用 ngModel 并且所有按钮都被选中。

当用户选中复选框时,我正在尝试获取 (hero.id)。我该怎么做?我的错误是什么。

我的 HTML

<div>
  <form (submit)="onSubmit()">
    <tr *ngFor="let hero of heroes">
      <input type="checkbox" name="timeid" value={ {hero.id}} class={{hero.id}}>{{hero.time}}<br>
    </tr>
    <input type="submit" class="btn btn-primary" value="Remove Alarms">
  </form>
</div>

这是我的组件。

import { Component, OnInit } from '@angular/core';
import {ValidateService} from '../../services/validate.service';
import {AlarmService} from '../../services/alarm.service';
import {FlashMessagesService} from 'angular2-flash-messages';
import {Router} from '@angular/router';

@Component({
  selector: 'app-register',
  templateUrl: './register.component.html',
  styleUrls: ['./register.component.css']
})
export class RegisterComponent implements OnInit {

  hours;
  id: String;
  timeid: String;
  time;
  heroes: any[];


  constructor(
    private validateService: ValidateService,
    private FlashMessage: FlashMessagesService,
    private Router: Router,
    private AlarmService: AlarmService
  ) {


  }

  ngOnInit() {

    this.ui();
  }

  onRegisterSubmit() {

    this.ui();

    this.heroes = JSON.parse(localStorage.getItem('users'));

    var timeStr = new Date(this.hours);
    var date = new Date(timeStr);
    var day = date.getUTCDate();
    var year = date.getUTCFullYear();
    var month = date.getUTCMonth() + 1;
    var hour = date.getUTCHours();
    var minutes = date.getUTCMinutes();
    var dateStr = "Time is " + hour + ":" + minutes + " in 24 HRS Time and the Date is " + day + "/" + month + "/" + year;

    console.log(dateStr);

    var user = {
      hours: (new Date(this.hours.replace('T', ' ').replace('-', '/'))).valueOf(),
      id: new Date().getTime(),
      time: dateStr,
      flag: 0,
    }


    setTimeout(() => {
      this.FlashMessage.show('Your alarm has been added.', {
        cssClass: 'alert-success',
        timeout: 5000
      });
    }, 10);

    var storage = localStorage.getItem('users');
    var final = [];
    if (storage == null || typeof(storage) == undefined) {
      final.push(user);

      localStorage.setItem('users', JSON.stringify(final));
      let time = new Date().getTime()

      this.AlarmService.setUpAlarms(time);

    } else {
      var get = JSON.parse(localStorage.getItem('users'));
      var size = Object.keys(get).length;

      for (var i = 0; i < get.length; i++) {
        final.push(get[i]);
      }
      final.push(user);
      localStorage.setItem('users', JSON.stringify(final));
      let time = new Date().getTime()

      this.AlarmService.setUpAlarms(time);
    }

  }


  ui() {
    setTimeout(() => {
      this.heroes = JSON.parse(localStorage.getItem('users'));
      console.log(this.heroes);
    }, 100);
  }

  onSubmit() {
    var user = {
      timeid: this.timeid,
    }
    console.log(user);

  }
}

【问题讨论】:

    标签: angular


    【解决方案1】:

    这是一个简单的例子:

    plunker:https://plnkr.co/edit/1nWBj5Z48vFYPOw6nbDa?p=preview

    要检测用户选中的框,您需要使用change 事件绑定。然后调用您的函数并将其传递给更改$event$event 这里是至关重要的语法。然后您可以从该事件中访问各种内容,主要是 target,它是已更改的 HTML 元素 &lt;input&gt;。然后您将获得 id,因为它是该输入的值。

        //our root app component
    import {Component, NgModule, VERSION} from '@angular/core'
    import {BrowserModule} from '@angular/platform-browser'
    
    @Component({
      selector: 'my-app',
      template: `
        <div>
          <h2>Hello {{name}}</h2>
          <div>
            <form>
              <tr *ngFor="let hero of heroes">
              <input (change)="check($event)" type="checkbox" name="timeid" value ="{{hero.id}}" class="{{hero.id}}">{{hero.time}}<br>
              </tr>
            </form>
          </div>
        </div>
      `,
    })
    export class App {
      name:string;
      // sample heros with an id and time..
      heroes =
        [
          {"id":1,"time":"2017-06-01T05:00:00.000Z"},
          {"id":2,"time":"2017-06-02T05:00:00.000Z"},
          {"id":3,"time":"2017-06-03T05:00:00.000Z"},
          {"id":4,"time":"2017-06-04T05:00:00.000Z"},
          {"id":5,"time":"2017-06-05T05:00:00.000Z"}
        ];
      constructor() {
        console.log(JSON.stringify(this.heroes))
        this.name = `Angular! v${VERSION.full}`
      }
      check(e){
        console.log(e)
        console.log(e.target.checked)
        console.log(e.target.value)
      }
    }
    
    @NgModule({
      imports: [ BrowserModule ],
      declarations: [ App ],
      bootstrap: [ App ]
    })
    export class AppModule {}
    

    【讨论】:

    • 它有效,但你能解释一下英雄在这里做什么吗?它有效,但如果我理解的话,我会更有知识。那么他们有交流吗? newDate 有什么用?
    • 哦,这只是一个简单的数组.. 让我用一个显式数组来更新答案:)
    • 非常感谢您,先生,有一百万支持您。你拯救了我的一天!
    • 这就是为什么我总是在答案中包含代码:) 应该很容易将它移动到 plunker 或其他地方:)
    猜你喜欢
    • 2019-09-02
    • 1970-01-01
    • 2015-09-27
    • 2017-06-20
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多