【问题标题】:Angular 2 set selected on a select option dropdown在选择选项下拉列表中选择了 Angular 2 集
【发布时间】:2017-10-17 23:24:33
【问题描述】:

我有 2 个用户类型的对象:

  • users 拥有完整的用户列表。
  • selectedUsersgetUsersBySid 从 db 返回用户列表

所以我只想将getUsersById:selectedUsers 给出的用户标记为选中,我尝试了这个,但它不起作用:

<select multiple materialize="material_select" [materializeSelectOptions]="selectedUsers" [(ngModel)]="selectedUsers" name="users"> 
    <option value="" disabled selected>Usuarios</option>
    <option *ngFor="let user of users" [ngValue]="users" [selected]="selectedUsers.id === user.id">{{ user.name }} ({{ user.email }}) </option>
</select>

从数据库中检索用户的函数:

 getUsersBySid(){
        this.surveyService.getUsersBySid(this.selectedSurvey)
            .subscribe(
                users => {
                    this.selectedUsers = users;
                    console.log(this.users);
                    console.log(this.selectedUsers);
                }, 
                error => {
                    this.alertService.error("error cargar usuarios");
                }
            );
    }

Console.log():

用户(3 个用户对象):

(3) [Object, Object, Object]
0:Object
id:"1"
name:"administrador"
pass:"21232f297a57a5a743894a0e4a801fc3"
__proto__:Object
1:Object
2:Object
length:3
__proto__:Array(0)

selectedUsers(1 个用户对象):

(1) [Object]
0:Object
id:"1"
name:"administrador"
pass:"21232f297a57a5a743894a0e4a801fc3"
__proto__:Object
length:1
__proto__:Array(0)

编辑 2: 如果我打印两个对象,我可以看到 selectedUsers 正在更改,但下拉菜单未标记为选中 selectedUsers

<select multiple materialize="material_select" [materializeSelectOptions]="selectedUsers" [(ngModel)]="selectedUsers" name="selectedUsers"> 
    <option value="" disabled selected>Usuarios</option>
    <option *ngFor="let user of users" [ngValue]="user">{{ user.name }} ({{ user.email }}) </option>
</select>
Selected: {{selectedUsers}}<br/>
Users: {{users}}

【问题讨论】:

    标签: angular angular2-template angular2-forms


    【解决方案1】:

    正如您在问题中发布的那样,selectedUsers 有一个来自 db 的用户列表,您不能以这种方式将其用作对象 selectedUsers.id

    您可以尝试以下选项,但首先,您必须从您的option 元素中删除[selected]="selectedUsers.id === user.id",因为它与[(ngModel)] 有一些冲突。

    Option1(plunker 中的第一个下拉菜单):将 user(object) 与 [ngValue] 绑定,然后 selectedUsers 的项目必须保留来自 users 的项目的确切实例,这意味着您必须将selectedUsersusers 进行比较,并从原始users 列表中推送具有相同值的用户。

    Option2(plunker 中的第二个下拉菜单):将user.id 与[ngValue] 或[value] 绑定,则应将 selectedUser 设置为user.id 的数组。

    OPtion3(plunker 中的第三个下拉菜单):使用 compareWith,这似乎是最简单的方法。

    <select [compareWith]="compareFn"  [(ngModel)]="selectedCountries">
      <option *ngFor="let country of countries" [ngValue]="country">
        {{country.name}}
      </option>
    </select>
    
    // define this function in your component
    compareFn(c1: Country, c2: Country): boolean {
      return c1 && c2 ? c1.id === c2.id : c1 === c2;
    }
    

    请参阅下面的plunker 了解上述所有解决方案。

    【讨论】:

    • 我已经用对象编辑了问题,抱歉使用术语列表
    • 在您的 plunker 中,对象方法不起作用,对吗?您发送 2 个对象,但选择的选项是第一个:/
    • @PriNcee 我只是举个例子。因为第二个对象有不同的实例。请检查我更新的 plunker。抱歉,我刚刚完成。
    • @PriNcee 对象方法部分适用于第一项(它与用户数组保持相同的实例),不适用于第二项(保持不同的实例,这只是为了展示对你的不同)。希望它会有所帮助。 :)
    • 我正在尝试第三种解决方案,非常感谢@Pengyy,但我得到了那个错误:未处理的承诺拒绝:模板解析错误:无法绑定到“compareWith”,因为它不是已知属性'select' 我忘了什么吗?
    猜你喜欢
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    相关资源
    最近更新 更多