【问题标题】:Why is Knockout populating a column for all rows with the same value?为什么 Knockout 为具有相同值的所有行填充一列?
【发布时间】:2012-12-20 18:33:29
【问题描述】:

这里省略了一些东西:http://jsfiddle.net/YwTBk/

基本上,获得下图所需的只是编辑第一行。出于某种原因,Knockout 正在用相同的值填充该列下的所有行。它发生在amountnrAmount,当然还有计算出的total 列。其他列都没有这个问题。

有趣的是,将绑定从 amount 更改为 $data.amount 会导致计算列 nrAmount 不再起作用,但不会导致所有行都被填充。

为什么会发生这种情况,我该如何解决?

【问题讨论】:

  • 绑定语法对我来说看起来不错。问题似乎出在其他地方。由于您的小提琴不完整,它可能在缺少的组件中。可能是另一个事件或订阅导致了更新?
  • @adaptive 我真正省略的唯一事情是填充类别和部门可观察数组。我在 <table> 中也有 <tbody><thead> 定义。 HTML 中有关“金额”一词的所有 JavaScript 代码和绑定都在其中。我对这个困惑了很长时间。我想我会为它写一个测试用例。
  • 你的小提琴根本不起作用,你甚至没有包括淘汰赛。
  • 至少有一个主要问题:您总是以self = this; 开头的函数定义。如果您不使用var self = this;,则此变量self 将是全局变量,因此在下次调用这些函数时会覆盖。
  • @Niko 差不多了。这只是调整绑定的问题。这就是我没有完全理解代码示例的结果!如果您想复制/粘贴它作为答案,我会将其标记为解决方案。

标签: javascript jquery data-binding knockout.js


【解决方案1】:

我猜这是一个“有效”的更新小提琴 - http://jsfiddle.net/YwTBk/2/。您对问题的描述与您引用的小提琴不符,因此很难确定。

我修复的较大问题如下:

  1. 正如 Niko 所提到的,您需要在视图模型的顶部使用 var self = this;
  2. 我将 addBlankRecord 移到您的视图模型中,以便 addBlankRecord 方法中的 self 引用起作用。
  3. 我更新了 populateBlankRecords 方法,使其引用 ViewModel 上的 addBlankRecord
  4. 对于您的绑定,我将类别和 removeRecord 的绑定更新为 $parent.categories 和 $parent.removeRecord,因为在 Record 视图模型中都找不到这些绑定。

我猜还有几个较小的问题是由于从您的代码中删除了一些内容。其中一些被其他 cmets 引用。

  • removeRecord、GetDepartments 和 GetCategories 方法不存在
  • 没有表格 HTML 标记
  • 没有对 jQuery 或 KnockoutJS 的引用

这能解决您的问题吗?如果没有,如果您能提供一个演示问题的小提琴将会非常有帮助。

【讨论】:

  • 这些正是我所做的更改。感谢您将其总结为答案。你得到了勾号。 :)
猜你喜欢
  • 2015-10-03
  • 1970-01-01
  • 1970-01-01
  • 2016-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-24
相关资源
最近更新 更多