【问题标题】:KnockoutJS observableArray binding not being notified of update when using foreach使用 foreach 时未通知 KnockoutJS observableArray 绑定更新
【发布时间】:2017-01-16 18:26:17
【问题描述】:

我有一个问题,如果我将 foreach 绑定与 observableArray 一起使用,我不会看到对 observableArray 所做的更改反映在屏幕上。

绑定如下所示:

<div data-bind="foreach: items">
  <p>
    <input data-bind="value: name" />
  </p>
  <p>Name: <span data-bind="text: name"></span></p>
  <br />
</div>

observableArray 如下所示:

this.items = ko.observableArray([
    { name: 'Person 1', role: 'Sales' },
    { name: 'Person 2', role: 'Accounts' },
    { name: 'Person 3', role: 'Admin' }
  ]);

这是一个 JSFiddle 来说明问题: https://jsfiddle.net/ue3opdd2/2/

HTML 使用水平分隔符分成 2 个部分。在第 1 节中是一个使用可观察对象的绑定。如果您修改文本框,您会看到更改反映在下面的 span 元素中。这是有效的。

在第 2 节中是完全相同的主体,但使用 observableArray 和 foreach 绑定。例如,如果您更改“Person 1”文本框中的值,我希望看到此更改反映在下面的 span 元素中,但它不起作用(它保持为“Name:Person 1”)。

我在屏幕底部放置了一个调试输出,但我也没有看到 observableArray 更新的值。

我可以看到的主要区别是 observableArray 是“复杂类型”。我的意思是每个元素都由一个包含名称和角色的对象组成。这会有所不同吗?

谁能帮我解决这个问题?

【问题讨论】:

  • 数组中的项目也需要是可观察的。

标签: knockout.js


【解决方案1】:

observableArray 不会自动使其内容可观察:

关键点:一个 observableArray 跟踪数组中有哪些对象, 不是那些对象的状态

仅仅将一个对象放入 observableArray 并不能完全满足 该对象的属性本身是可观察的。当然可以 如果您愿意,可以使这些属性可观察,但这是一个 自主选择。 observableArray 只跟踪它的对象 保持,并在添加或删除对象时通知侦听器。

(来自http://knockoutjs.com/documentation/observableArrays.html

如果您更新您的视图模型并使name 可观察,您的代码应该按照您期望的方式工作:

var ViewModel = function () {
  this.item = ko.observable('Test name');

  this.items = ko.observableArray([
    { name: ko.observable('Person 1'), role: 'Sales' },
    { name: ko.observable('Person 2'), role: 'Accounts' },
    { name: ko.observable('Person 3'), role: 'Admin' }
  ]);
};

ko.applyBindings(new ViewModel());

【讨论】:

  • 在您提交答案时添加了我的答案。 :)
  • 欣赏编辑!作为适当的块引用看起来好多了。
  • 非常感谢您的回复 - 我以为我做错了什么,但我现在可以看到这是正确的行为。我写了这个超简单的例子来演示这个问题,但实际上 observableArray 来自服务器的 JSON。是否有推荐的方法来获取 JSON 对象,使用该 JSON 数据更新 observableArray,并使其中一个子字段可观察?
  • 我的 Knockout 有点生疏了,但你可以依靠映射插件 (knockoutjs.com/documentation/plugins-mapping.html)。像这样:jsfiddle.net/rxbrw8Lb fromJS 的第二个参数中的空对象是您调整映射选项的地方。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-02
  • 2013-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
  • 1970-01-01
相关资源
最近更新 更多