当显示数组中的一系列值时,数据项没有正确绑定到模型,如下所示:
$scope.model = {
values: [
"Value 1",
"Value 2,
...
]
}
如果在一系列输入字段中显示上述内容,则对内容的更改不会反映在模型中。 但是,使用如下代码绑定上述内容确实保持了与模型的绑定:
<div ng-repeat="value in model.values">
<input type="text" ng-model="model.values[$index]" />
</div>
然而,这种方法的问题是文本字段失去了对每个键的关注。 一个演示在这里:
http://jsfiddle.net/donovanh/GSx76/
我假设你有这个:
<div ng-repeat="model.values 中的值"> <input type="text" ng-model="value" /> </div>
这将不起作用,因为您绑定到一个范围。 基本上你必须在ng-model
有一个.
ng-model
否则反向数据绑定不适用于原语。
所以这基本上是预期的,因为您绑定到 scope.value 属性而不是转发器中的原始值。
您的解决方法也预期闪烁,因为数据绑定更改了数组,然后使转发器看起来好像Value 1
离开了,新的Value 2X
出现了,因此转发器删除旧的 DOM节点并用新的 DOM 节点替换它,因此失去焦点。
我知道这是违反直觉的,但这就是系统的架构方式。 不要绑定到原语是我的答案。
感谢您的跟进。 我将调整我的数据结构以考虑到这一点。
我的例子也不起作用: http :
我遵循了此处给出的解决方案,但没有产生任何效果,问题仍然存在。
这里给出的解决方案说,“你必须在ng-model
有一个.
ng-model
。” 你没有这样做。 你的是ng-model="field"
。
您需要重组您的数据,以便您拥有一个 _objects_ 而不是字符串的数组。
这是一个固定的小提琴: http :
哦,我的错。 谢谢。
我想将这项工作作为功能请求提交(尽管我承认这不太可能,因为到目前为止对这个问题的回应哈哈)。 这条评论是否足以做到这一点,还是我应该开一个新问题?
你试过这个版本的 ng-repeat 指令吗?
https://github.com/angular/angular.js/pull/1661
它修复了转发器在原始值方面的许多问题。
@NickHeiner :我不确定您要求什么特定功能?
我正在请求一个功能,您可以在其中直接绑定到 ng-repeat 中的字符串。
你现在可以这样做了。 我怀疑您的意思是您希望在更新字符串时更新 ng-repeat 之外的范围?
是的,我希望能够在字符串列表的ng-repeat
使用ng-model
并且能够按预期进行双向绑定工作。
我明白为什么它现在不起作用,并意识到让它工作可能比它的价值更麻烦,但我认为值得研究,因为它会使 angular 更容易使用。
在不改变 Javascript 工作方式的情况下使其工作的唯一方法
是在重复循环中使用 someArray[$index] 。 例如
这允许您直接引用元素,以便更改
反映在数组中。
但这在当前的 ng-repeat 实现中不能正常工作
因为包含输入的 div 不断被破坏或移动
围绕每个变化。 我之前引用的修复程序确实允许这样做。
2012年12月12日15:35,尼克·海纳[email protected]写道:
是的,我希望能够在 ng-repeat 中使用 ng-model
字符串列表,并能够按预期进行两种方式的绑定工作。我明白为什么它现在不起作用,并意识到让它起作用
可能比它的价值更麻烦,但我认为值得研究
因为它会使 angular 更容易使用。—
直接回复本邮件或在 Gi tHub上查看
是的,这有效。 谢谢!
这适用于 angular 1.1.4-(重复字符串数组)
这是一种将字符串数组的成员有效绑定到 UI 组件的方法。 我使用了 textarea 框,但可以通过输入或其他方式完成相同的操作:
嗨,请我需要将文本字段绑定到 ng-repeat 中的每一行。 我希望文本字段的每一行都有不同的值。 我的 ng-model 将一个值绑定到我的 ng-repeat 中的所有文本字段。 请问你如何建议我继续。
好的,我想出了一种使用最新版本的 angular 让它工作的方法。 如果数组的大小不会改变,那么您可以使用一次绑定,如下所示:
<li ng-repeat="str in ::arrayOfStrings">
<input ng-model="arrayOfStrings[$index]" />
<br/>
</li>
这将防止重复更改 dom 并且将正确观察对基元的更改。
我能够解决这个问题,并通过使用 track by(针对 1.3 版进行测试)来避免失去焦点的问题
<div ng-repeat="value in model.values track by $index">
<input type="text" ng-model="model.values[$index]">
</div>
toboid:感谢分享该解决方法! 我遇到过将数组数据重组为对象数组会非常麻烦的情况(在递归指令视图中)。 按 $index 跟踪有帮助。
我想知道为什么“跟踪”可以解决这个问题? 根本原因是什么?
感谢@toboid解决了我的问题,它有效。
如果您不想将对象包装在数组中
<div ng-repeat="value in model.values track by $index">
<input type="text" ng-model="model.values[$index]">
</div>
我已经使用上面的示例动态创建了带有单选按钮的表单,其中在提交操作时我无法获取表单数据值。请指导如何解决
在上面的示例 ng-model 中,不能与 ng-repeat 一起使用。 而表单提交它只在控制台中给出未定义的值....
@gissivaraman开一张新票,请遵循提交问题的基本指南。 不要把你的问题推到另一个上。
最有用的评论
我能够解决这个问题,并通过使用 track by(针对 1.3 版进行测试)来避免失去焦点的问题