我想使用angular-ui的 ui.select
来填充multiple dropdown field
。我想将选定的对象传递给ng-model并将其映射到我的选项,包含相同结构的对象,但不是来自同一来源:
<div ng-repeat="training in trainings">
<form class="form-horizontal" role="form">
<ui-select multiple ng-model="training.skills" theme="select2" ng-disabled="disabled">
<ui-select-match placeholder="Wähle Skills...">{{$item.name}}</ui-select-match>
<ui-select-choices group-by="skillTypeGrp" repeat="skill.id as skill in skills | filter: $select.search">
<span>{{skill.name}}</span>
</ui-select-choices>
</ui-select>
</form>
</div>
来自trainings
的{{1}}列表带有示例培训,如下所示:
ng-repeat
[{"description": "",
"skills": [{"type": "tech",
"name": "C",
"id": 194}],
"id": 1,
"name": "Test"}]
中的skills
列表包含与ui-select-choices
中相同的数据结构:
training.skills
不幸的是,这不起作用。 ui-select清空我的[{"type": "tech",
"name": "C#",
"id": 194},
{"type": "tech",
"name": "Java",
"id": 197},
...]
,向我显示一个空白的选择字段。我理解angularjs无法映射这些对象,如果它们不是同一个数组,如this blogpost中所述。它建议使用 training.skills
告诉track by
使用哪个属性来映射两个对象列表,但是如果我将ui.select
行更改为:
ui-select-choices
没有什么变化。
是否有可能在没有像single property binding example建议的那样用ID替换我的对象的情况下运行它?
答案 0 :(得分:2)
您需要撤消filter
和track by
以使其有效:
<ui-select-choices group-by="skillTypeGrp" repeat="skill in skills | filter: $select.search track by skill.id">
它看起来很奇怪,但为我做了诀窍......
答案 1 :(得分:0)
如果我没错,你试图将整个对象与其id进行比较。
您是否尝试使用:
<ui-select-choices group-by="skillTypeGrp" repeat="skill in skills | filter: $select.search">
<span>{{skill.name}}</span>
</ui-select-choices>
注意我从重复中删除了“skill.id”。我想通过这种方式你应该比较对象,希望它能起作用。
否则我将保留ui-select-choices,并在ui-select中传递一系列ID(所选训练)以匹配列表。当然,这意味着每次发生变化时都会有更多的编码来更新技能数组。
希望它有所帮助。
答案 2 :(得分:0)
如果你参考https://msdn.microsoft.com/en-us/library/system.datetime.parse(v=vs.110).aspx给出的文件
track by
必须始终是最后一个表达式。
所以,正如madc所建议的,如果你改为:
<ui-select-choices group-by="skillTypeGrp" repeat="skill in skills | filter: $select.search track by skill.id">
它会起作用。
以下是关于跟踪的文档摘要:作为最后一个表达式: