【问题标题】:material 2 Autocomplete: select option材料 2 自动完成:选择选项
【发布时间】:2017-07-14 15:40:41
【问题描述】:

我想在选择一个选项时调用一个函数。 经过一番搜索,我似乎必须使用:

MdAutocompleteTrigger

属性optionSelections

在文档中: https://material.angular.io/components/component/autocomplete 选项选择 自动完成选项选择流。

我不明白,什么是流,如何实现?

【问题讨论】:

  • 我可以在我的组件中添加 MdAutocompleteTrigger:@ViewChild(MdAutocompleteTrigger) trigger:MdAutocompleteTrigger;`ngAfterContentInit() { setTimeout(() =>this.trigger.openPanel()); }` 但我不能使用 optionSelections,谁能给我一个例子
  • 我试试这个ngAfterContentInit() { setTimeout(() => Observable.merge(...this.trigger.optionSelections) .subscribe((option)=>console.log(option))); },但不工作

标签: angular angular-material2 md-autocomplete


【解决方案1】:

Material Autocomplete 组件有自己的optionSelected 事件输出:

模板:

<mat-autocomplete (optionSelected)="onSelectionChanged($event)"> 
  <mat-option *ngFor="let item of myItems" [value]="item">
    {{ item }}
  </mat-option>
</mat-autocomplete>

控制器:

import { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete';

// ...

onSelectionChanged(event: MatAutocompleteSelectedEvent) {
  console.log(event.option.value);
}

见:Angular Material API Docs - MatAutocompleteSelectedEvent

【讨论】:

  • 重要的是不要忘记 $ 符号,并且在连接事件输出时仅在模板中将其称为“事件”。其他一切都会给你一个未定义的变量。在文档中找不到任何关于此的内容......不敢相信......
【解决方案2】:

onSelectionChange 事件替换了selected 事件。现在可以识别何时选择或取消选择该项目。

需要将$event 参数传递给目标方法以区分这两种情况,否则 md-autocomplete 将调用该方法两次(一次使用新选择的项目,一次使用取消选择/先前的值)。
如果文档能更清楚地说明这些更改,那就太好了。

下面如何只获取“on select”事件:

模板

<md-autocomplete #panel="mdAutocomplete" [displayWith]="displayFn">
  <md-option (onSelectionChange)="selected($event, country)" 
             *ngFor="let country of filteredCountries | async" [value]="country">
    <div class="selector-elements">
        {{ country.name }}
      </div>
</md-option>

控制器

 selected(event: MdOptionSelectionChange, country: ICountry) {
    if (event.source.selected) {
        this.propagateChange(country);
    }
}

【讨论】:

  • 取消选择该选项时,我没有触发任何事件。我以与您的示例相同的方式使用 mat-aoutocomplete 和 onSelectionChange 。任何想法为什么?
  • 代码示例使用旧版本的 Angular 材料。现在你应该使用 而不是 。否则代码应该仍然有效。也许你可以用你的代码为它创建一个新问题,这样我就能更好地帮助你。只需在此处写下我的网址即可。
【解决方案3】:

在 md-option 上你可以设置“onSelect”

<md-autocomplete #auto="mdAutocomplete">
    <md-option (onSelect)="callSomeFunction()" *ngFor="let state of states" [value]="state.name">{{ state.name }}</md-option>
</md-autocomplete>

自 beta 3 以来,功能发生了变化:

<md-autocomplete #auto="mdAutocomplete">
    <md-option (onSelectionChange)="callSomeFunction()" *ngFor="let state of states" [value]="state.name">{{ state.name }}</md-option>
</md-autocomplete>

【讨论】:

    【解决方案4】:

    我无法使用最新的角材料 (2.0.0-beta.3) 得到答案“onSelect”。它从未被调用过。

    我现在发现它是:

      <md-option *ngFor="let item of item" [value]="item.name" (onSelectionChange)="myChangeFunc($event, item)">
        {{ item.name }}
      </md-option>
    

    换句话说,它现在似乎被称为 onSelectionChange。文档似乎仍然含糊不清,并继续说“自动完成选项选择流”,这实际上没有任何意义。

    也请参阅 Franceso 的回答,但在大多数情况下,您需要传入 $event 以检查事件信息。

    【讨论】:

    • @PeterS 我切换到最新版本,如果我选择一个新元素,现在 onSelectionChange 会触发两次。它也发生在你身上吗?我创建了一个包含详细信息的 SO 问题:stackoverflow.com/questions/44056913/…
    • @Francesco 这是一个已知的错误:github.com/angular/material2/issues/4356 由于代码冲突,它没有合并到 beta.5,我希望它在 beta.6,我不知道任何解决方法,除了快速连续地对两个更改进行编码/检查输入字段中的文本。等待修复可能值得。
    • 这个例子应该在 Angular Material 网站上。它只是草率的文档。谢谢!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 2020-03-29
    • 2018-10-20
    • 2017-11-20
    • 2019-01-31
    • 2019-09-17
    相关资源
    最近更新 更多