Joh*_*han 28 angular angular-forms
我知道有类似的问题已被提出,但我找不到一个好的答案.我想以Angular形式创建一个选择列表,其中每个选项的值是一个对象.另外,我不想使用2路数据绑定.例如,如果我的Component包含以下字段:
lUsers: any[] = [ { Name: 'Billy Williams', Gender: 'male' }, { Name: 'Sally Ride', Gender: 'female'} ]; curUser: any;
我希望我的HTML模板包含这个:
<select #selectElem (change)="setNewUser(selectElem.value)"> <option *ngFor="let user of lUsers" [ngValue]="user"> {{user.Name}} </option> </select>
但是,使用此代码,我的setNewUser()函数接收所选用户的Name字段的内容.为什么它选择那个特定的领域,我不知道.我期望它会收到所选选项的"值",我专门设置为用户对象.
请注意,我在选项中使用了ngValue而不是value.这是通过SO的其他人的建议.如果我使用值代替,那么会发生的事情是对象被转换为字符串'[Object object]',这是setNewUser()接收的,这是无用的.
仅供参考,我正在使用角度4.0.0和@ angular/cli 1.1.2在Windows 10上工作.这是setNewUser()方法:
setNewUser(user: User): void { console.log(user); this.curUser = user; } // setNewUser()
我正在确定将我的日志记录传递给它的确切内容,以及在模板上包含的内容: <pre>{{curUser}}</pre>
Ste*_*ven 37
我正在使用[ngValue]
它并存储对象就好了.
在这个问题中可以找到有关您使用(change)
而不是使用问题的原因的解释(ngModelChange)
所以,既然你已经使用过[ngValue]
,你可能想做类似的事情,你只能使用单向绑定才能使用ngModelChange指令:
<select (ngModelChange)="setNewUser($event)" (ngModel)="lUsers">
<option *ngFor="let user of lUsers" [ngValue]="user">
{{user.Name}}
</option>
</select>
Run Code Online (Sandbox Code Playgroud)
并且您的ts文件将捕获事件并接收User对象而无需通过id跟踪它,基本上重用您的旧方法将足够好:
setNewUser(user: User): void {
console.log(user);
this.curUser = user;
}
Run Code Online (Sandbox Code Playgroud)
Dhy*_*yey 20
由于标签的value
属性option
不能存储整个对象,我们将id
在lUsers
数组中创建一个新属性以跟踪所选项目.
HTML:
<select #selectElem (change)="setNewUser(selectElem.value)">
<option *ngFor="let user of lUsers" [value]="user.id">
{{user.Name}}
</option>
</select>
Run Code Online (Sandbox Code Playgroud)
这将把id
我们的独特setNewUser
功能传递给我们的变革功能.
在你的component.ts中:
...
lUsers: any[] = [
{ id: 1, Name: 'Billy Williams', Gender: 'male' },
{ id: 2, Name: 'Sally Ride', Gender: 'female'}
];
curUser: any = this.lUsers[0]; // first will be selected by default by browser
...
setNewUser(id: any): void {
console.log(id);
// Match the selected ID with the ID's in array
this.curUser = this.lUsers.filter(value => value.id === parseInt(id));
console.log(this.curUser);
}
Run Code Online (Sandbox Code Playgroud)
这是上面代码的plnkr演示.打开开发人员工具以查看控制台日志.
您可以在-Elements上使用[ngValue]代替[value]。这个对我有用。
我在这里找到该信息:https : //www.reddit.com/r/Angular2/comments/65run4/select_option_using_value_vs_ngvalue/
Angular 6 只需这样做
HTML
<div class="col-3" style="float:left;padding-left: 18px !important;">
<label>Vehicle No.</label>
<div *ngIf="gpsDevicesArray && gpsDevicesArray.length > 0">
<select [ngModel]="selectedVehicle" style="padding: 7px;border-radius: 4px;"
(ngModelChange)="onVehicleNumberChange($event)">
<option *ngFor=" let device of gpsDevicesArray" [ngValue]="device">
{{device.vehicleNumber}}
</option>
</select>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
打字稿
// 对于初始值(将此行放在服务器调用函数中)
this.selectedVehicle = gpsDevicesArray[0];
Run Code Online (Sandbox Code Playgroud)
// 监听器
onVehicleNumberChange(device) {
console.log("selectedVehicle ====", device);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
76472 次 |
最近记录: |