假设以下JSON结构,这与我目前正在使用的内容大大简化:
$scope.var1 = {
"test1": {
"name": "test1",
"belongsTo": "var1",
"additionalInformation": "blabla"
},
"test2": {
"name": "test2",
"belongsTo": "var1",
"additionalInformation": "blabla"
},
"test3": {
"name": "test3",
"belongsTo": "var1",
"additionalInformation": "blabla"
}
};
$scope.var2 = {
"test8": {
"name": "test8",
"belongsTo": "var2",
"additionalInformation": "blabla"
},
"test2": {
"name": "test2",
"belongsTo": "var2",
"additionalInformation": "blabla"
},
"test9": {
"name": "test9",
"belongsTo": "var2",
"additionalInformation": "blabla"
}
};
$scope.valuesVar1 = {
"test1": {
"value": 1
},
"test2": {
"value": 2
},
"test3": {
"value": 3
},
};
$scope.valuesVar2 = {
"test8": {
"value": 4
},
"test2": {
"value": 5
},
"test9": {
"value": 6
},
};
Var1和Var2代表一些数据,它们总是具有相同的结构。对于valuesVar1和valuesVar2也是如此 - 它们具有相同的结构,并包含var1和var2的一些附加信息。
我正在尝试迭代var1并使用ng-init从valuesVar1获取值。在用户交互中,迭代的赋值更改为var2,因此我们知道我们正在迭代var2并从valuesVar2获取值。
问题:当迭代var2时,我们应该得到“test2”的值5。但由于ngInit已经通过迭代var1“知道”test2,因此该值保持为2。
注意:请不要给出答案,建议更改JSON结构或类似内容 - 因为我不能做到这一点。我已经尝试复制像这里提出的对象:angularjs - ngRepeat with ngInit - ngRepeat doesn't refresh rendered value - 但这不起作用。我假设这是因为ngInit“记住”字符串值“test2”而不是对象引用(但我真的不知道:))。
问题:如何在迭代中再次运行ngInit,在上一次迭代中已经使用了对象的相同键?
我还准备了一个包含信息的jsfiddle http://jsfiddle.net/S329r/6/。在运行时,它迭代var1并输出如下值:
test1: 1
test2: 2
test3: 3
到目前为止,我很期待这一点。但是,当为迭代分配var2时,以下显示:
test2: 2
test8: 4
test9: 6
这里我希望test2显示值5.(提示:在jsfiddle演示中,“更改”按钮将迭代的分配更改为var2
,“更改后退”将其更改回{{1 }})。
答案 0 :(得分:4)
一种解决方案是确保为JSON中的每个项目生成唯一ID。当然,你不能像你说的那样改变你的JSON,但你可以强制angularJS生成一个.JSON。
把它放在你的重复循环中:
iter in iterateOver track by $id(iter.name + iter.belongsTo)
只要数据组合是唯一的,您的循环就能正常工作。
文档中的更多信息:
例如:项目中的项目按$ id(项目)跟踪。内置的$ id()函数可用于为数组中的每个项分配唯一的$$ hashKey属性。然后,此属性用作关联DOM元素与按标识的数组中相应项的关键字。在数组中移动相同的对象将以相同的方式在DOM中移动DOM元素。
修改强>
另一个解决方案是稍微改变你的循环并且不要使用ng-init
相反,得到这样的价值观:
<div ng-repeat="iter in iterateOver " >
{{iter.name}}: {{getValForIter(iter).value}}
</div>