繁体   English   中英

AngularJS - 在ngRepeat中重置ngInit

[英]AngularJS - reset ngInit in ngRepeat

假设以下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不刷新渲染值 - 但这不起作用。 我假设这是因为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演示中,按钮“Change”将迭代的赋值更改为var2 ,“Change Back”将其更改回var1 )。

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

把它放在你的重复循环中:

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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM