AngularJS - 在ngRepeat中重置ngInit

时间:2014-08-04 16:28:13

标签: javascript angularjs angularjs-ng-repeat angularjs-ng-init

假设以下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 }})。

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>