16

我正在使用ng-bootstrap typeahead组件来搜索客户数据库。当用户从预先输入的结果列表中选择客户时,我导航到客户详细信息页面。我已经完成了这项工作,但我想在导航发生后清除输入字段。我尝试在selectItem事件逻辑中将模型设置为 null 或空字符串,但这不起作用:

客户搜索-typeahead.component.html

<template #resultTemplate let-r="result" let-t="term">
  <div>
    <div>
      {{r.resource.name[0].given}} {{r.resource.name[0].family}}
    </div>
    <div>
      {{r.resource.birthDate | date: 'dd/MM/yyyy'}}
    </div>
  </div>
</template>

<input type="text" class="form-control" [resultTemplate]="resultTemplate" (selectItem)="onSelect($event)"
       [(ngModel)]="model" placeholder="Start typing a customer name..." [ngbTypeahead]="search"/>

客户搜索-typeahead.component.ts

@Component({
  selector: 'customer-search-typeahead',
  template: require('./customer-search-typeahead.component.html'),
  styles: [`.form-control { width: 300px; }`]
})
export class CustomerSearchTypeaheadComponent {

  model: any;
  searching: boolean;

  constructor(private customerService: CustomerService, private router: Router) {}

  onSelect($event) {
    this.router.navigate(['/customers', $event.item.resource.id]);
    this.model = null;
  };

  search = (text$: Observable<string>) =>
   //omitted for brevity
}

做出选择后,预先输入的输入如下所示:

在此处输入图像描述


解决方案

客户搜索-typeahead.component.html

<input type="text" class="form-control" #input [ngbTypeahead]="search" (selectItem)="onSelect($event); input.value='' ">

客户搜索-typeahead.component.ts

onSelect($event, input) {
    $event.preventDefault();
    this.router.navigate(['/customers', $event.item.resource.id]);
  };
4

2 回答 2

40

您目睹的问题源于NgModel指令异步更新模型绑定并且实际模型在方法执行后更新。onSelect因此,您的模型更新会被NgModel功能覆盖。

幸运的是,我们(ng-bootstrap 的作者)已经准备好所有的弹性点来覆盖您的用例 :-) 您可以做几件事。

首先,$event传递给该onSelect方法的对象具有该preventDefault()方法,您可以调用它来否决项目选择(并因此写回模型和输入字段更新)。

$event.preventDefault()将确保模型未更新,并且输入字段未使用所选项目更新。但是用户输入的文本仍将是输入的一部分,因此如果您也想清除它,您可以直接更新input'value属性。

这是一起演示所有这些技术的代码:

onSelect($event, input) {
    $event.preventDefault();
    this.selected.push($event.item);
    input.value = '';
  }

其中input参数是对输入 DOM 元素的引用:

<input type="text" class="form-control" #input 
   [ngbTypeahead]="search" (selectItem)="onSelect($event, input)">

最后,这是一个在实践中展示所有这些的 plunker:http ://plnkr.co/edit/kD5AmZyYEhJO0QQISgbM?p=preview

于 2016-09-30T17:23:23.323 回答
1

以上是模板参考值解决方案。

这适用于 ngModel 解决方案。

html代码:

<input type="text" class="form-control" [resultTemplate]="resultTemplate" (selectItem)="onSelect($event)"
       [(ngModel)]="model" placeholder="Start typing a customer name..." [ngbTypeahead]="search"/>

组件代码:

onSelect($event) {
    $event.preventDefault();
    this.model = null;
    this.router.navigate(['/customers', $event.item.resource.id]);
};

$event.preventDefault();

对于 ngModel 值更改为空

于 2019-05-08T14:21:26.767 回答