我正在开展我的第一个Angular项目,并且我遇到了双向数据绑定的问题。
app.component.html
<div>
<table class="table table-hover">
<thead>
<tr>
<th>S.no</th>
<th>Product Name</th>
<th>Cost</th>
<th>Amount</th>
<th>Tax</th>
<th>Total</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let item of shoppingList, let i=index">
<th> </th>
<th>{{shoppingList[i]}}</th>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
<tr>
<th><button type="button" (click) ="onAddButtonClick()" class="btn btn-primary">Add</button></th>
<th><select class="form-control">
<option (input)="selectedItemName=$event.target.value" ngDefaultControl *ngFor="let selectedItem of getProducts()" >{{selectedItem.name}}</option>
</select></th>
<th></th>
<th><input type="text" class="form-control" id="usr"></th>
<th></th>
<th></th>
</tr>
</tbody>
</table>
</div>
app.component.ts
import { Component,Input } from '@angular/core';
import {StaticDataSourceService} from './static-data-source.service';
import {ProductRepository} from './product.repo';
import {Product} from "./product";
import {ShoppingList} from "./shoppingList";
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
public shoppingList:String[]=[];
public selectedItem:Product =new Product();
public selectedItemName:String;
title = 'app';
constructor(private repository:ProductRepository){
}
getProducts():Product[]{
return this.repository.getProducts();
}
onAddButtonClick(){
console.log(this.selectedItemName);
}
addToCart(name:String){
this.shoppingList.push(name);
}
}
我想要实现的目标:我想将下拉列表的值传递给onAddButtonClick()方法并将值添加到数组中(目前我只是尝试打印它)。但是,我不断获得控制台输出&#39; undefined&#39;。我也遇到了一些错误,在经过很多帖子之后,我添加了ngDefaultControl,这使得错误消失了。 ngDefaultControl有什么作用?提前感谢两个问题。
答案 0 :(得分:0)
问题的关键是你的option
元素在更改事件期间触发selectedItemName
的设置。您正在使用input
事件,但我认为您希望使用change
并希望将其附加到select
元素,而不是单个选项元素。
<select
class="form-control"
(change)="selectedItemName=$event.target.value"
>
<option *ngFor="let selectedItem of getProducts()" >{{selectedItem.name}}
</option>
</select>
您可能需要在$watch
元素上设置select
以响应事件,而不是数据绑定
答案 1 :(得分:0)
以下是我在您的代码中看到的问题。
1
<tr *ngFor="let item of shoppingList, let i=index">
<th> </th>
<th>{{shoppingList[i]}}</th>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
为什么不使用item
而不是使用索引访问您的数组。
像
<tr *ngFor="let item of shoppingList, let i=index">
<th> </th>
<th>{{item.something}}</th>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
constructor
或ngOnInit()
。我可以继续导入ShoppingList,它看起来像你的shoppingList的模型,但你只是使用shoppingList:String []。尝试上面的解决方案,如果您仍需要帮助,请告诉我。