【问题标题】:Value not displaying for Material2 AutocompleteMaterial2 自动完成的值不显示
【发布时间】:2017-10-19 15:21:38
【问题描述】:

我正在尝试让自动完成功能显示对象的一个​​参数但保存另一个参数,到目前为止它似乎没有表现。

代码根据 Material2 自动完成网站:Autocomplete

不同之处在于 [value] 我要保存 'option.Id' 而不是 'option'。

错误在于,虽然它记录了 option.Id,但实际上并没有在输入字段中显示值(将其留空)。

my-comp.html

<md-input-container>
   <input type="text" mdInput [formControl]="myControl" [mdAutocomplete]="auto">
</md-input-container>

<md-autocomplete #auto="mdAutocomplete" [displayWith]="displayFn">
   <md-option *ngFor="let option of filteredOptions | async" [value]="option.Id">
      {{ option.name }}
   </md-option>
</md-autocomplete>

my-comp.ts

class MyComp implements OnInit {
   myControl = new FormControl();
   options = [
     new User('Mary', 1),
     new User('Shelley', 2),
     new User('Igor', 3)
   ];
   filteredOptions: Observable<User[]>;

   ngOnInit() { 
      this.filteredOptions = this.myControl.valueChanges
         .startWith(null)
         .map(user => user && typeof user === 'object' ? user.name : user)
         .map(name => name ? this.filter(name) : this.options.slice());
   }

   filter(name: string): User[] {
      return this.options.filter(option => new RegExp(`^${name}`, 'gi').test(option.name)); 
   }

   displayFn(user: User): string {
      return user ? user.name : user;
   }
}

class User {
name: string;
id: number;

constructor(name: string, id: number)
this.name = name;
this.id = id;
}

【问题讨论】:

  • 试试[ngValue]
  • 一件小事可能会导致问题。在 ngfor 循环中使用 Id 代替 id
  • ngValue 抛出模板解析错误,因为它不是 md 选项的一部分。正在正确设置 ID,只是没有显示值。

标签: angular angular-material2 md-autocomplete


【解决方案1】:

尝试给自动完成一个模型(例如:myModel)

<md-autocomplete #auto="mdAutocomplete" [displayWith]="displayFn" [(ngModel)]="myModel">
   <md-option *ngFor="let option of filteredOptions | async" [ngValue]="option.Id">
      {{ option.name }}
   </md-option>
</md-autocomplete>

这里,[ngValue]myModel 提供了option.Id 的值。

当您检索模型myModel 时,您将获得option.Id

如果需要,您可以通过将(ngModelChange)="onChange($event)" 添加到您的&lt;md-autocomplete&gt; 来帮助自己,以便操作组件中的数据。

【讨论】:

  • ngValue 抛出模板解析错误,因为它不是 md-options 的一部分
【解决方案2】:

问题出在 displayFn 函数中,它期望 User 对象作为参数,但您传递的 user.id 是一个数字,并且由于不匹配,没有值被传递给视图。

我在Plunker 中有一个工作示例。

displayFn(userId: number) {
      return userId;
   }

【讨论】:

    【解决方案3】:

    您可以使用displayWithmd-autocompleteoptions 过滤,根据绑定到md-optionuser.id 找到user.name,这里您需要使用bind(this) 才能访问数据的组件。

    <md-autocomplete #auto="mdAutocomplete" [displayWith]="displayFn.bind(this)">
    

    并在displayFn 函数处进行过滤

    displayFn(id: number): string {
      if (!id) return '';
      let index = this.options.findIndex(option => option.id === id);
    
      return  index === -1 ? '' : this.options[index].name;
    }
    

    参考plunker demo

    评论:在您的模板中您使用的是Id,但在您的User 类中它是id。我认为这也可能导致设置空白,如果您更正此错字,user.id 将设置为md-input

    【讨论】:

    • 我正在尝试使用 json 文件,在读取 json 文件之前执行了“displayFn”方法。我怎样才能实现动态的传递值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多