*ng用于在添加新输入元素时重置所有表单值
*ngFor resetting all form values when adding new input element
我有一个 Angular2 应用程序,它带有一个按钮,可以在我的贷款中添加另一笔贷款。我的 *ngFor 也很简单:
<div *ngFor="let loan of myLoans">
<label>{{loan.name}}</label>
<input type="text" name="loan.name" [(ngModel)]="loan.amount">
</div>
myLoans
是具有 name
和 amount
参数的 Loan 对象数组。我的按钮也很简单
<button id="addLoan" type="button" (click)="addLoan()">Legg til lån</button>
addLoan() 函数:
addLoan(): void{
var newLoan = new Loan();
this.myLoans.push(newLoan);
}
我的问题是,当我在列表中添加新贷款时,我在其他贷款的输入字段中的任何值都将返回 0 或我在贷款对象的构造函数中设置的任何值。
加载应用显示此图片
ngModel 在输入数字时正常工作
按下"Legg til lån"按钮后,第一个输入的值被重置
如果我尝试输入另一个数字,ngModel 仍在为第一个输入工作
有人知道这里发生了什么吗?
输入的值变为零,因为您已将 [(ngModel)] 声明为 *ngFor 的迭代器对象。当您将空白对象推送到 myLoans 的数组时,ngModel 会将输入更改为零(金额的默认值)
示例:
myLoans = [0, 1, 2, 3]
当您刷新页面时,[(ngModel]) 将数组的最后一个值绑定到输入 (3)。
如果输入125,
然后您还更改了最后一个数组的值
myLoans = [0, 1, 2, 125]
如果您压入一个新元素,Angular 将使用最后一个数组值刷新输入
myLoans = [0, 1, 2, 125, 0]
Input.value 现在 = 0
我的意见:在 *ngFor 中使用 ngModel 是一种不好的做法,还有另一种方法可以使用 (click) 事件和 Angular 选择器来完成相同的任务。试试这个:
<input #loan ..>
<button (click)="addLoan(loan.value)">Add Loan</button>
我 99% 确定您使用的是表单,但没有唯一的 name
属性,因为 ngModel
有效。
name 属性必须是唯一的才能作为单独的字段进行评估。 Angular 并不真正关心表单中的 ngModel
,而是查看 name
属性。
请注意您当前设置的名称属性:name="loan.name"
实际上只包含字符串文字 loan.name
而不是模型的实际值,因此名称不是唯一的。
因此,当您推送新的 loan
时,所有其他贷款都会获得与新推送的值相同的值,因为所有字段的评估都是相同的。
这可以通过在名称属性中添加索引轻松解决,例如:
<div *ngFor="let loan of myLoans; let i=index">
<label>{{loan.name}}</label>
<input type="text" name="loan.name{{i}}" [(ngModel)]="loan.amount">
</div>
我试过你的代码,对我来说效果很好。我假设这可能是编译器问题。尝试将您的 ng2 和 typescript 库更新到最新版本。这是部分 tsconfig 文件的示例:
{
"compilerOptions": {
"target": "es5",
"typeRoots": ["node_modules/@types/"],
"types": [
"node",
"es6-shim"
]
}
}
同时避免使用 "var" 进行变量声明。使用 "let" 来保持变量范围。我认为您的问题可能是因为使用了 var。如果您使用的是旧编译器,它可能会弄乱您的对象。
AJT_82 接近问题,因为非唯一名称给您带来了问题,但是您可以做一个更简单的修复,并且按照您可能想要的方式进行修复,通过将模板 html 更改为此
<div *ngFor="let loan of myLoans">
<label>{{loan.name}}</label>
<input type="text" [name]="loan.name" [(ngModel)]="loan.amount">
</div>
请注意将名称放在 [ ] 中的更改。这将确保模板维护名称的 link,只要每笔贷款的名称是唯一的,标识符也是唯一的。
更新:
如果名称不唯一,您可以为其添加索引以使其唯一。
<div *ngFor="let loan of myLoans; let i=index">
<label>{{loan.name}}</label>
<input type="text" [name]="loan.name + '_' + i" [(ngModel)]="loan.amount">
</div>
@Joo_Beck建议使用[name]=loan.name
代替name='loan.name'
。但这对我不起作用。我刚刚添加了一个索引 {{i}}
,其名称如下所示,并且效果很好。
<div *ngFor="let loan of myLoans; let i=index">
<label>{{loan.name}}</label>
<input type="text" name="loan.name{{i}}" [(ngModel)]="loan.amount">
</div>
@AJT_82 建议对我有用的解决方案。谢谢!
谢谢@Cassiano 你解释的很好!
我有一个 Angular2 应用程序,它带有一个按钮,可以在我的贷款中添加另一笔贷款。我的 *ngFor 也很简单:
<div *ngFor="let loan of myLoans">
<label>{{loan.name}}</label>
<input type="text" name="loan.name" [(ngModel)]="loan.amount">
</div>
myLoans
是具有 name
和 amount
参数的 Loan 对象数组。我的按钮也很简单
<button id="addLoan" type="button" (click)="addLoan()">Legg til lån</button>
addLoan() 函数:
addLoan(): void{
var newLoan = new Loan();
this.myLoans.push(newLoan);
}
我的问题是,当我在列表中添加新贷款时,我在其他贷款的输入字段中的任何值都将返回 0 或我在贷款对象的构造函数中设置的任何值。
加载应用显示此图片
ngModel 在输入数字时正常工作
按下"Legg til lån"按钮后,第一个输入的值被重置
如果我尝试输入另一个数字,ngModel 仍在为第一个输入工作
有人知道这里发生了什么吗?
输入的值变为零,因为您已将 [(ngModel)] 声明为 *ngFor 的迭代器对象。当您将空白对象推送到 myLoans 的数组时,ngModel 会将输入更改为零(金额的默认值)
示例:
myLoans = [0, 1, 2, 3]
当您刷新页面时,[(ngModel]) 将数组的最后一个值绑定到输入 (3)。
如果输入125,
然后您还更改了最后一个数组的值
myLoans = [0, 1, 2, 125]
如果您压入一个新元素,Angular 将使用最后一个数组值刷新输入
myLoans = [0, 1, 2, 125, 0]
Input.value 现在 = 0
我的意见:在 *ngFor 中使用 ngModel 是一种不好的做法,还有另一种方法可以使用 (click) 事件和 Angular 选择器来完成相同的任务。试试这个:
<input #loan ..>
<button (click)="addLoan(loan.value)">Add Loan</button>
我 99% 确定您使用的是表单,但没有唯一的 name
属性,因为 ngModel
有效。
name 属性必须是唯一的才能作为单独的字段进行评估。 Angular 并不真正关心表单中的 ngModel
,而是查看 name
属性。
请注意您当前设置的名称属性:name="loan.name"
实际上只包含字符串文字 loan.name
而不是模型的实际值,因此名称不是唯一的。
因此,当您推送新的 loan
时,所有其他贷款都会获得与新推送的值相同的值,因为所有字段的评估都是相同的。
这可以通过在名称属性中添加索引轻松解决,例如:
<div *ngFor="let loan of myLoans; let i=index">
<label>{{loan.name}}</label>
<input type="text" name="loan.name{{i}}" [(ngModel)]="loan.amount">
</div>
我试过你的代码,对我来说效果很好。我假设这可能是编译器问题。尝试将您的 ng2 和 typescript 库更新到最新版本。这是部分 tsconfig 文件的示例:
{
"compilerOptions": {
"target": "es5",
"typeRoots": ["node_modules/@types/"],
"types": [
"node",
"es6-shim"
]
}
}
同时避免使用 "var" 进行变量声明。使用 "let" 来保持变量范围。我认为您的问题可能是因为使用了 var。如果您使用的是旧编译器,它可能会弄乱您的对象。
AJT_82 接近问题,因为非唯一名称给您带来了问题,但是您可以做一个更简单的修复,并且按照您可能想要的方式进行修复,通过将模板 html 更改为此
<div *ngFor="let loan of myLoans">
<label>{{loan.name}}</label>
<input type="text" [name]="loan.name" [(ngModel)]="loan.amount">
</div>
请注意将名称放在 [ ] 中的更改。这将确保模板维护名称的 link,只要每笔贷款的名称是唯一的,标识符也是唯一的。
更新: 如果名称不唯一,您可以为其添加索引以使其唯一。
<div *ngFor="let loan of myLoans; let i=index">
<label>{{loan.name}}</label>
<input type="text" [name]="loan.name + '_' + i" [(ngModel)]="loan.amount">
</div>
@Joo_Beck建议使用[name]=loan.name
代替name='loan.name'
。但这对我不起作用。我刚刚添加了一个索引 {{i}}
,其名称如下所示,并且效果很好。
<div *ngFor="let loan of myLoans; let i=index">
<label>{{loan.name}}</label>
<input type="text" name="loan.name{{i}}" [(ngModel)]="loan.amount">
</div>
@AJT_82 建议对我有用的解决方案。谢谢!
谢谢@Cassiano 你解释的很好!