【问题标题】:AngularJS - reset ngInit in ngRepeatAngularJS - 在 ngRepeat 中重置 ngInit
【发布时间】:2014-08-05 08:00:13
【问题描述】:

假设以下 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 已经“知道” test2 通过迭代 var1,所以该值保持为 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,“更改回”将其更改回 var1)。

【问题讨论】:

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


    【解决方案1】:

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

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

    iter in iterateOver track by $id(iter.name + iter.belongsTo)
    

    只要数据组合是唯一的,您的循环就会正常工作。

    来自文档的更多信息:

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

    编辑 另一种解决方案是稍微改变你的循环,不要使用ng-init 相反,让你的价值观是这样的:

    <div ng-repeat="iter in iterateOver " >
        {{iter.name}}: {{getValForIter(iter).value}}
    </div>
    

    【讨论】:

    • 好点!昨天晚上洗澡的时候,我也想到了调用该方法:) 很高兴,它有效!我更新了 jsfiddle 以供将来参考:jsfiddle.net/S329r/11 谢谢!
    • 是的,我发现这个小提琴很有用——我阅读了文档并用它弄明白了。认为您可能不喜欢它作为解决方案,因为它并没有真正回答您的重置问题 - 它有点回避它。
    • 也是正确的,但它现在有效。我搜索了“重置”ngInit 或“删除缓存”的方法,但没有找到任何东西。也许这不是故意的行为。无论如何,如果有人找到这个问题的“真正答案”,它仍然可以在这里添加:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 2013-05-29
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多