Angular2:如何将选定项目从 HTML 数据列表元素传递回组件?

Posted

技术标签:

【中文标题】Angular2:如何将选定项目从 HTML 数据列表元素传递回组件?【英文标题】:Angular2: How do you pass a selected item from a HTML datalist element back to the component? 【发布时间】:2017-01-07 21:35:03 【问题描述】:

我有一个简单的组件,其中包括一个用于创建下拉框的组件。此列表填充了来自 Web API 调用的结果。出于显示目的,我只使用项目的两个字段。但是,一旦选择了一个元素,我就需要对所有其他字段进行处理。如何将整个元素传递回组件?

非常感谢任何帮助。

<h1>Get Locations</h1>
<div>
    <div>
        <input list="browsers" name="browser" #term (keyup)="search(term.value)">
        <datalist id="browsers">
            <option *ngFor="let item of items | async" >
                item.code + " " + item.description
            </option>
        </datalist>
    </div>
    <input type="submit" value="Click" (click)="onSelect(item)" />
</div>

组件代码如下:

import  Component, OnInit         from '@angular/core';
import  Observable        from 'rxjs/Observable';
import  Subject           from 'rxjs/Subject';
import  LocationService  from './location.service';
import Location from './location.component';
import './rxjs-operators';

@Component(
    selector: 'lesson-08',
    templateUrl: './views/lesson08.html',
    providers: [LocationService]
)
export class Lesson08 implements OnInit

    constructor(private locationService: LocationService)  

    aLoc: Location;

    ngOnInit() 
        this.aLoc = new Location();
    

    errorMessage: string;
    locations: Location[];
    mode = 'Observable';
    displayValue: string;

    private searchTermStream = new Subject<string>();

    search(term: string) 
        this.searchTermStream.next(term);
    

    onSelect(item: Location) 
        // do stuff with this location

    

    items: Observable<Location[]> = this.searchTermStream
        .debounceTime(300)
        .distinctUntilChanged()
        .switchMap((term: string) => this.locationService.search(term));
    

【问题讨论】:

如果用户没有从数据列表中选择一个项目,而是键入他们自己的输入怎么办?我认为您基本上有两种选择,将数据列表结果映射到组件中的地图中,然后根据用户输入查找原始对象,或者在用户输入完成后进行第二次搜索 在这种情况下不允许输入他们自己的输入。嗯,这就是意图。额外的查找正是我想要避免的。 Web API 已经返回了一种 Location 类型,它具有我需要的所有数据属性。您能否澄清“将数据列表结果映射到地图”的意思?谢谢 当查询数据以数组形式返回时,将其映射到由显示字符串键入的对象中。示例var m=; arrayData.forEach (d=&gt;m[keyOf (d)]=d); 我也面临同样的情况..... 【参考方案1】:

调用该方法的 (click) 事件应该在选择的选项上。您声明的“项目”仅在 *ngFor 的范围内是已知的,因此在其子级的范围内也是如此。你声明的级别太高了。

【讨论】:

以上是关于Angular2:如何将选定项目从 HTML 数据列表元素传递回组件?的主要内容,如果未能解决你的问题,请参考以下文章

Angular 2:如何从表单的不同选项中获取选定的值?

如何将数据绑定下拉列表中的选定项目置于会话状态?

如何在angular2中获取多选下拉选定值

angular2-webpack-starter 如何将 NodeJS 服务器添加到项目中

Android,如何从我的数据库更新列表视图中的选定项目?

进行生产构建时如何使用带有 WebPack 的 AngularCLI 复制选定的文件