angular - 最初加载现有选项失败
问题描述
最初加载(现有的iu.unit
)失败:
<select id="unit" name="unit" #unit="ngModel" class="form-control"
[(ngModel)]="iu.unit" (change)="onDropdownChangeUnit(rec,iu)">
<option *ngFor="let i of UI_Units" [ngValue]="i">{{i.name}}</option>
</select>
它向我显示 allunit
来自UI_Units
,但不显示 的初始值iu.unit
。
我做错了什么?
更新
结构,我使用foreach
over all ingridientUnit => iu
,尝试为其分配初始值。
但是当用户想要改变它时UI_Units => coming from backend(asp.net Core)
——它应该被重新分配给iu.unit
.
export class Recipe{
id: string;
ingridientUnit: IngridientUnit[] // iu
// ...
}
export class IngridientUnit {
id: string;
unit: Unit[]
// ...
}
export class Unit {
id: string;
name: string;
// ...
}
从服务器获取:
getUnits(filter: ServerRequest) {
return this._http.get(this.myAppUrl + 'Unit/GetUnits' + '?' + this.toQueryString(filter))
.pipe(map((res: Unit[]) => { return res; }));
}
解决方案
首先,在下拉列表中select
只显示它的孩子option
。
因此,iu.unit
必须在,UI_Units
否则默认情况下不会选择任何内容,并且选项iu.unit
不会出现在列表中。
我们可以检查Angular Forms 的代码,我想引导您关注第 134writeValue
行和第 178 行_getOptionId
,
writeValue(value: any): void {
this.value = value;
const id: string|null = this._getOptionId(value);
// excerpt only
}
_getOptionId(value: any): string|null {
for (const id of Array.from(this._optionMap.keys())) {
if (this._compareWith(this._optionMap.get(id), value)) return id;
}
return null;
}
writeValue
当一个值被传递给带有 的元素时被调用ngModel
,然后在包含所有子选项的映射中查找该值。如果找不到代表值的选项(在您的情况下iu.unit
),则不会发生任何有意义的事情。
最重要的是,该选项默认情况下不会出现在 select 元素下,只有当它明确包含在模板中时才会出现。
我已经创建了一个工作示例来说明您要完成的工作,请注意这iu.unit
是数组中的一个元素UI_Units
。这就是它的比较算法的工作原理。
推荐阅读
- ruby-on-rails - Rails:可以将禁用的选项作为有效的参数值发送吗?
- python - 如何使服务器 id 成为 arg discord.py
- python-3.x - 在 Tkinter 类之间传递变量(Python3.7)
- expo - 我正面临一些与博览会弹出有关的问题
- angular - 影子根 &::part() 仅在 IOS 中不适用于任何组件
- javascript - 如何在 ReactJS 中的多个基于类的组件上使用 Formik
- r - purrr 循环中的 mutate_if 或 map_if。如果安全的结果不为空,那么做一些事情
- label - TextInputLayout 浮动标签未对齐
- macos - 使用管理员的 brew 安装 svn 后,如何与其他用户一起使用?
- validation - Odoo 导入向导“跳过”不包含“金额”或小于 1 的行