Javascript 敲除可写计算可观测值

Javascript 敲除可写计算可观测值,javascript,knockout.js,knockout-2.0,Javascript,Knockout.js,Knockout 2.0,我目前正在使用Knockout构建一个数量非常多的应用程序,我遇到了一个使计算的可观察可写的问题 目前,我有一个下拉选项,其中用户选择一个年龄组,从中选择的值填充旁边的文本输入,以显示该年龄组的人口,这是一个计算的可观察值。下拉列表和文本输入值都是从数组填充的 我在下面设置了一个代码笔,但基本上您会看到文本输入的值是通过计算的可观察值生成的,并且当您从下拉列表中选择值时,会应用正确的格式(通过自定义绑定处理程序!) 我遇到的问题是,如果您在文本输入中输入自定义值(直接输入到文本框,而不是从下拉列

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

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

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

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

self.selectedPopulation = ko.computed({

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

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

  });
代码笔:
(写入函数位于第76行。)

您需要将所选总体设置为正常可观察,并订阅chosenAge observable,以便在其更改时收到通知

您需要使用虚拟对象创建chosenAge,以防止绑定时敲除爆炸:

self.chosenAge = ko.observable({age: '', population: ''});
然后将您的计算值更改为可观察值:

// Selected population
self.selectedPopulation = ko.observable('');
self.chosenAge.subscribe(function (newValue) {
    self.selectedPopulation(newValue.population);
});
并订阅可观察的chosenAge:

// Selected population
self.selectedPopulation = ko.observable('');
self.chosenAge.subscribe(function (newValue) {
    self.selectedPopulation(newValue.population);
});

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

这并不能直接回答您提出的问题;但我认为定制绑定处理程序是解决格式问题的错误方法。我通常会将未格式化的数据存储在一个可观察的文件中,并有一个只读的计算程序,该程序只为显示添加格式。如果他们需要编辑一个数字,我认为编辑框中不应该有逗号。即使你允许他们用读写方式进行编辑,我仍然看不到定制绑定的必要性。这几乎就是了。我们更接近了,谢谢你。唯一的问题是,如果您从下拉列表中选择一个值,然后输入一个自定义值,自定义值将写入关联的下拉列表项,因此如果您随后返回并在下拉列表中可用的选项之间切换,您将看到自定义值与当时选择的任何选项相关联。如果您输入自定义值,然后返回下拉列表,则每次都需要重置这些值并返回原始值。。。代码笔:啊,我想知道这是否是你想要的!更新为一个更简单的解决方案,现在可以做您想要的事情。