Angularjs:从密钥对中解析值
angularjs: resolve value from key pair
是否有任何简单的方法来找到数组中的键并返回其值,而不是与angularjs键(也许通过使用表达式)?
现在,我这样做:
vm.topics = [{id:1,value:"a"} , {id:2,value:"b"} , {id:3,value:"c"}];
vm.tickets= [{topic:2,summary:"summary 1"} , {topic:1,summary:"summary 2"}];
vm.getTopicName = function (id) {
for (int t=0 ; t<vm.topics.length ; t++)
if (vm.topics[t].id == id)
return vm.topics[t].value;
return id;
};
和HTML部分:
<tr data-ng-repeat="item in vm.tickets">
<td>{{vm.getTopicName(item.topic)}}</td>
<td>{{item.summary}}</td>
</tr>
有没有像
<td>{{item.topic | id as value in vm.topics}}</td>
有趣的例子,但我认为它说明了问题。
——UPDATE——
正如@jantimon在评论中提到的,一种方法是将list更改为真实密钥对的对象,并简化一切:
vm.topics1 = {};
for (var i=0; i < vm.topics.length; i++) {
var t = vm.topics[i];
vm.topics1[t.id] = t.value;
}
和HTML只是更改为:
<td>{{vm.topics1(item.topic)}}</td>
实际上你使用两个不同的数组和从你的评论(ajax调用)我将创建新的数组在服务中,合并 topics
和tickets
,像:
[... ,
{
topic:2,
summary:"summary 1",
ticket_value: "b"
},
... ]
所以控制器应该只绘制它(没有额外的逻辑)。这种方式将减少ng-repeat
循环中的监视器,并且您不需要调用(rebuild) getTopicName()
我认为这是正确的方式
为了简化你的例子,如果你使用下划线库,你可以这样写:
<td>{{topics[_.findIndex(topics, {id: item.topic})].value}}</td>
Demo in Fiddle