Angular 无法使用[displayWith]检查mat自动完成值类型

Angular 无法使用[displayWith]检查mat自动完成值类型,angular,typescript,autocomplete,angular-material,Angular,Typescript,Autocomplete,Angular Material,我使用了mat autocomplete,还有一个名为[displayWith]的功能,用于设置值的格式,据我所知,它有一些用处。在这个场景中,我有以下问题: 1.什么是[displayWith]的确切用途?即使用户输入自由文本而不是选择选项,它也可以用于检查自动完成中的文本类型吗?或者,如果未选择任何选项,则清除输入 2。我想调用一个方法,如下所示,以检查该值是否被选中,但它不起作用。那么,我可以根据文本的类型调用该方法吗 我使用类似的方法: <md-autocomplete #auto

我使用了
mat autocomplete
,还有一个名为
[displayWith]
的功能,用于设置值的格式,据我所知,它有一些用处。在这个场景中,我有以下问题:

1.什么是
[displayWith]
的确切用途?即使用户输入自由文本而不是选择选项,它也可以用于检查自动完成中的文本类型吗?或者,如果未选择任何选项,则清除输入

2。我想调用一个方法,如下所示,以检查该值是否被选中,但它不起作用。那么,我可以根据文本的类型调用该方法吗

我使用类似的方法:

<md-autocomplete #auto="mdAutocomplete" [displayWith]="displayFn.bind(this)">
  <md-option *ngFor="let state of filteredStates | async" [value]="state.id">
    {{ state.name }}
  </md-option>
</md-autocomplete>


displayFn = (data?: any) => {
    return data ? this.sometask(data) : '';
}

sometask(data) {
    console.log(typeof(data));
}

{{state.name}
显示fn=(数据?:任何)=>{
返回数据?此.sometask(数据):“”;
}
任务(数据){
控制台日志(数据类型);
}
  • 如果要显示存储在控制值中的不同内容,需要使用displayFn e.q(如果提供
  • 从列表中选择项后,您将在自动完成中看到“Name”,其中“Name”来自数据对象{Name:“Name”}。这意味着,您可以在不更改控件模型的情况下显示您想要的任何内容

  • 您需要提供整个对象作为控制值(它与1.point相关,因为现在displayFn有意义。):)

  • 非常感谢这些好的解释。1.就目前来看,它主要用于以不同格式显示数据。在这种情况下,如果我们不需要任何关于显示格式的信息,那么在选择时调用方法似乎不需要使用
    [displayWith]
    方法。在这种情况下,我们可以使用onSelected事件。是这样吗。实际上,我使用这种方法,通过检查值的
    typeof
    来检测是否选择了该选项。但是,尽管该页面上的演示有效,但在该示例中,我的项目总是将
    string
    返回到
    RequireMatch
    方法。所以,也许我需要设置所选的值,以便将它们与自由文本条目区分开来。但是我不确定我是否应该使用
    [displayWith]
    来实现这一点?如果你想显示state.name,你需要使用它,因为你的控制模型应该存储整个对象{name:string,id:string'。如果没有displayFn,你可以在占位符[object object]中看到:)3.另一方面,如果用户无法选择选项,是否可以清除自动完成输入?这似乎是不可能的,因为[displayWith]仅在选择时调用该方法。如果用户在选择后键入,则它无法捕获此事件,
    blur
    事件在尝试了许多不同的操作后也没有解决我的问题:(很可能,这一切都取决于具体情况,因此很难假设哪种方法是最好的。我建议您将整个对象存储在控件中,并使用displayWith进行显示格式设置
    displayFn(data)=>`${data.name}`