Javascript AngularJS-在ngRepeat中重置ngInit

Javascript AngularJS-在ngRepeat中重置ngInit,javascript,angularjs,angularjs-ng-repeat,angularjs-ng-init,Javascript,Angularjs,Angularjs Ng Repeat,Angularjs Ng Init,假设以下JSON结构,它与我目前使用的结构相比得到了极大简化: $scope.var1 = { "test1": { "name": "test1", "belongsTo": "var1", "additionalInformation": "blabla" }, "test2": { "name": "test2", "belongsTo": "var1", "additi

假设以下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结构或类似内容的答案,因为我无法做到这一点。我已经试着复制这里提议的对象:-但这不起作用。我假设这是因为ngInit“记住”字符串值“test2”,而不是对象引用(但我真的不知道:))

问题:如果在上一次迭代中已经使用了对象的同一个键,如何让ngInit在迭代中再次运行

我还准备了一份包含这些信息的JSFIDLE。运行时,它在var1上迭代并输出如下值:

test1: 1
test2: 2
test3: 3
<div ng-repeat="iter in iterateOver " >
    {{iter.name}}: {{getValForIter(iter).value}}
</div>
到目前为止一切都很好,我期待这一点。但当为迭代分配var2时,如下所示:

test2: 2
test8: 4
test9: 6

这里我希望test2显示值5。(提示:在JSFIDLE演示中,按钮“Change”将迭代的分配更改为
var2
,“Change Back”将其更改为
var1
)。

一个解决方案是确保为JSON中的每个项生成唯一的Id。当然,您不能像您所说的那样更改JSON,但您可以强制angularJS生成一个JSON

把这个放在你的重复循环中:

iter in iterateOver track by $id(iter.name + iter.belongsTo)
只要数据的组合是唯一的,循环就会正常工作

文档中的更多信息:

例如:项目中的项目按$id跟踪(项目)。内置的$id()函数可用于为数组中的每个项分配唯一的$$hashKey属性。然后,该属性被用作通过标识将DOM元素与数组中的相应项关联的键。在数组中移动相同的对象将以相同的方式在DOM中移动DOM元素

编辑 另一个解决方案是稍微更改循环,不要使用
nginit
相反,请按如下方式获取您的值:

test1: 1
test2: 2
test3: 3
<div ng-repeat="iter in iterateOver " >
    {{iter.name}}: {{getValForIter(iter).value}}
</div>

{{iter.name}:{{getValForIter(iter.value}}

这一点很好!昨天晚上在淋浴时,我也想到了一个方法:)很高兴,它起作用了!我更新了JSFIDLE以备将来参考:谢谢!是的,我发现那把小提琴很有用——我读了一本文档,然后胡乱地弄了弄才弄明白。我想你可能不喜欢它作为一个解决方案,因为它不能真正回答你的重置问题-它有点回避它。这也是正确的,但它现在起作用了。我搜索了“重置”ngInit或“删除缓存”的方法,但没有找到任何东西。也许这不是故意的行为。无论如何,如果有人找到了这个问题的“真正答案”,它仍然可以添加到这里:)