【问题标题】:Knockout writable computed observablesKnockout 可写计算 observables
【发布时间】:2014-08-28 01:17:48
【问题描述】:

我目前正在使用 Knockout 构建一个数量非常多的应用程序,但我遇到了使计算出的 observable 可写的问题。

目前我有一个下拉选项,用户可以在其中选择一个年龄组,从中选择的值会填充它旁边的文本输入,以显示该年龄组的人口,这是一个计算出的 observable。下拉列表和文本输入值都是从数组中填充的。

我已经在下面设置了一个 codepen,但基本上你会看到文本输入的值是通过计算的 observable 生成的,并且当你从下拉列表中选择一个值时会应用正确的格式(通过自定义绑定处理程序!)。

我遇到的问题是,如果您在文本输入中输入自定义值(直接输入到文本框中,而不是从下拉列表中选择一个值),那么当您模糊文本框时,自定义格式是'没有应用于您输入的值,我很不确定如何解决这个问题。

self.selectedPopulation = ko.computed({

    read: function () {
      return self.chosenAge().population;
    },

    write: function (value) {
      // write value back here?
    },

  });

代码笔:http://codepen.io/anon/pen/HkguL (写函数在第 76 行。)

【问题讨论】:

  • 这并不能直接回答您提出的问题;但我认为自定义绑定处理程序是解决格式问题的错误方法。我通常会将未格式化的数据存储在可观察的数据中,并进行只读计算,以添加仅用于显示的格式。如果他们需要编辑一个数字,我认为编辑框中不应该有逗号。即使您确实让他们通过读写进行编辑,我仍然看不到自定义绑定的必要性。

标签: javascript knockout.js knockout-2.0


【解决方案1】:

您需要将 selectedPopulation 设为普通的可观察对象,并订阅 selectedAge 可观察对象,以便在更改时收到通知。

您需要使用虚拟对象创建 selectedAge 以防止在绑定时击倒炸毁:

self.chosenAge = ko.observable({age: '', population: ''});

然后将您的计算结果更改为可观察对象:

// Selected population
self.selectedPopulation = ko.observable('');

并订阅 selectedAge 可观察对象:

self.chosenAge.subscribe(function (newValue) {
    self.selectedPopulation(newValue.population);
});

我以前没有使用过 CodePen,但我已经更新了您的代码 here,以防我在工作示例中遗漏了任何内容。

【讨论】:

  • 快到了。我们离得更近了,谢谢。唯一的问题是,如果您从下拉列表中选择一个值,然后输入一个自定义值,自定义值将写入关联的下拉项,因此如果您随后返回并在下拉列表中的可用选项之间轻弹,您会看到您的自定义值与当时选择的任何选项相关联。如果您输入自定义值然后返回下拉列表,则每次都需要重置这些值并返回原始值... codepen:codepen.io/anon/pen/uepEy
  • 啊,我想知道这是否是你想要的!更新为更简单的解决方案,现在应该可以满足您的需求。
猜你喜欢
  • 1970-01-01
  • 2021-06-18
  • 2013-10-31
  • 1970-01-01
  • 2012-06-04
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多