【问题标题】:angular2 form default input value doesn't set when initial click初始单击时未设置angular2表单默认输入值
【发布时间】:2016-10-27 12:45:36
【问题描述】:

我是一个初学者 angular2 程序员,现在正在学习它。

我正在创建一个表单,当用户单击员工时,它会显示包含员工当前数据的可编辑表单。但是,当我第一次点击一个用户(甚至再次点击同一个用户)时,用户的信息并没有达到输入值。

<!-- User list part-->
<table>
    <tr *ngFor="let emp of employees" (click)="empBtn(emp.empId)">
        <td>{{ emp.empName }}</td>
        <td>{{ getDepartName(emp.departId) }}</td>
        <td>{{ emp.empPhone }}</td>
        <td>{{ emp.wages.wage }}</td>
    </tr>
</table>

<!-- Editable part --> 
<button (click)="addBtn()">Add</button>
<div *ngIf="modeAdd || modeEdit">
    <form #form ="ngForm" (ngSubmit) = "onSubmit(form.value)">
        <label>Name </label><input type="text" name="name" value="{{ eName }}" ngModel>
        <label>Department </label><select name="depart" value="{{ eDepartment }}" ngModel><option *ngFor="let depart of departments">{{ depart.departName }}</option></select>
        <label>Phone </label><input type="text" value="{{ ePhone }}" name="phone" ngModel>
        <label>Wage </label><input type="text" value="{{ eWage }}" name="wage" ngModel>
        <button type="submit">Submit</button>
    </form>
</div>

但是,如果我点击另一个用户,它会在表单的输入标签中显示值。我可以通过将eNameeDepartmentePhoneeWage 设置为与[(ngModule)]="eName" 之类的双向绑定来解决此问题,但我不知道为什么我的代码无法正常工作。

这是打字稿部分。 empBtn 在用户单击用户时调用,它设置eNameeDepartmentePhoneeWage。仅供参考,即使我在eNameeDepartment, ... 上声明默认值,它也不会出现。谢谢您的考虑。

eName: string;
eDepartment: string;
ePhone: string;
eWage: number;

empBtn(empId: number): void {
    console.log('click Employee ID: ', empId);
    this.getEmployee(empId);
    this.modeAdd = false;
    this.modeEdit = true;
}

getEmployee(employeeId: number){
    let selectedEmp: Employee = this.employeesObj.getEmployee(employeeId);
    if(!selectedEmp){
        console.log("employees: Invalid Employee ID");
    }else{
        console.log("employees: Get Employee info",selectedEmp.empName);
        this.eName = selectedEmp.empName;
        this.eDepartment = this.getDepartName(selectedEmp.departId);
        this.ePhone = selectedEmp.empPhone;
        this.eWage = selectedEmp.wages.wage;
    }
}

【问题讨论】:

    标签: javascript html angular typescript


    【解决方案1】:

    我建议你研究反应形式,但有这个问题。

    http://blog.thoughtram.io/angular/2016/06/22/model-driven-forms-in-angular-2.html

    HTML

    <form [formGroup]="form" (ngSubmit) = "onSubmit(form.value)">
        <label>Name </label>
        <input type="text" formControlName="eName">
    
        <label>Department </label>
        <select formControlName="eDepartment">
            <option *ngFor="let depart of departments">{{ depart.departName }}</option>
        </select>
    
        <label>Phone </label>
        <input type="text" formControlName="ePhone">
    
        <label>Wage </label>
        <input type="text" formControlName="eWage">
        <button type="submit">Submit</button>
    </form>
    

    导入模块

    import { Component, OnInit} from '@angular/core';
    import { FormGroup, FormControl, Validators, FormBuilder } from '@angular/forms';
    

    在你的组件上

    form: FormGroup; // declare form as formgroup
    eName: string;
    eDepartment: string;
    ePhone: string;
    eWage: number;
    
    constructor(private fb: FormBuilder){ }
    
    ngOnInit() {
        this.updateForm()
    }
    
    updateForm(): void {
        this.form = this.fb.group({
            eName: [this.eName, Validators.required],
            eDepartment: [this.eDepartment, Validators.required],
            ePhone: [this.ePhone, Validators.required],
            eWage: [this.eWage, Validators.required],
        })
    }
    
    empBtn(empId: number): void {
        console.log('click Employee ID: ', empId);
        this.getEmployee(empId);
        this.modeAdd = false;
        this.modeEdit = true;
    
        this.updateForm();
    }
    
    getEmployee(employeeId: number){
        let selectedEmp: Employee = this.employeesObj.getEmployee(employeeId);
        if(!selectedEmp){
            console.log("employees: Invalid Employee ID");
        }else{
            console.log("employees: Get Employee info",selectedEmp.empName);
            this.eName = selectedEmp.empName;
            this.eDepartment = this.getDepartName(selectedEmp.departId);
            this.ePhone = selectedEmp.empPhone;
            this.eWage = selectedEmp.wages.wage;
        }
    }
    

    去年,我也在做和你一样的事情。对我来说,反应形式更好。您还可以搜索 FormBuilder 和 Validators。

    希望对你有帮助。

    【讨论】:

    • 感谢您让我知道这篇好文章,它使我的代码变得简单。我将从下一个 :) 开始使用这种格式,但不幸的是,fb.group 并且每个表单控件的第一个参数似乎只是初始值。在我的试验中,我无法将选定的值放入输入表单,而它作为初始值工作得很好。
    • 我认为您将this.eName 更改为第一个参数。我这样做是因为 WebStorm 引导它:)。但是,我通过将value = "{{ eName }}" 放入 html 中成功调用了 value。我从您的文章 “这就是 formControlName 指令发挥作用的地方。它几乎相当于模板驱动表单中的 ngModel 和 name 属性组合。” 非常感谢。如果在每个表单控件中添加值属性,与当前我的相同。
    • 之前,我创建的和你一样(会计仪表板)。我成功地使用了这种方法,或者我的代码可能有错误,因为我是直接在文本框中编码的。很高兴你现在让它工作。 :) 干杯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多