gpt4 book ai didi

Knockout.js 在字符串列表上使用 `value:` 绑定(bind)中的 `foreach` - 不更新

转载 作者:行者123 更新时间:2023-12-04 00:39:08 26 4
gpt4 key购买 nike

这是 a jsFiddle 演示以下问题:

给定对(可观察的)字符串列表的 foreach 绑定(bind),可观察对象似乎不会从绑定(bind)在 foreach 内的输入标签的更改中更新。人们会期望他们这样做。这是来自 jsFiddle 的示例:

HTML

<ul data-bind='foreach: list'>
<li><input data-bind='value: $data'/></li>
</ul>

<ul data-bind='foreach: list'>
<li><span data-bind='text: $data'></span></li>
</ul>

Javascript
​var vm = { list: [ko.observable('123'), ko.observable('456')] };
ko.applyBindings(vm);​

在上面的例子中,人们会期望更新第一个列表中的输入标签会导致 observables 更新。不幸的是,它们没有按预期更新,从第二个列表未能反射(reflect)对第一个列表所做的任何更改可以看出。

我验证了当输入元素发生变化时,列表实际上并没有被更新。
有趣的是,对 observables 所做的更改都反射(reflect)在两个列表中(正如人们所期望的那样)。即, vm.list[1]("444") 将更新两个列表的第二个元素。

我的记忆是 Knockout 2.0.0 没有这个问题,尽管我有待纠正。我没有在 Knockout 代码中找到任何文档、Google 或评论,这些文档说明了为什么这不起作用或如何实现预期的结果。

为什么这不能按预期工作,是否有任何不需要更改数据结构的解决方法?

最佳答案

我通过使用 value: $parent.list[$index()] 解决了这个问题,见 this jsFiddle .新绑定(bind)如下所示:

<ul data-bind='foreach: list'>
<li>
<input data-bind='value: $parent.list[$index()]' />
</li>
</ul>

也许可以通过自定义绑定(bind)来改进这一点。

另请参阅此相关 GitHub issue #708对于 Knockout.js。

knockout 3.0 更新:

knockout 现在提供 $rawData :
<ul data-bind='foreach: list'>
<li><input data-bind='value: $rawData'/></li>
</ul>

按预期创建双向绑定(bind)。

来自 Binding Context文档:

$rawData

This is the raw view model value in the current context. Usually this will be the same as $data, but if the view model provided to Knockout is wrapped in an observable, $data will be the unwrapped view model, and $rawData will be the observable itself.

关于Knockout.js 在字符串列表上使用 `value:` 绑定(bind)中的 `foreach` - 不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13350485/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com