复制相同值两次时可写计算变量不读取值

Writable computed variables does not read value when copying same value twice

我正在将输入格式化为货币并使用可写计算变量将值更新回文本框。

例如我有一个值 1234.12

我正在从记事本中复制值并将其粘贴到文本框中,在选项卡上它正在点击读取功能并将其格式化为货币并以 $1,234 的形式写回文本框。 当我粘贴相同的值 1234 时,它没有命中读取,而是直接按原样写入文本框,作为 1234 标签输出。

我在js中也遇到过这个问题

如果我多次粘贴相同的值,你知道如何设置值的格式吗?

您可以使用 { notify: "always" } 扩展器来确保您的数据始终得到格式化。

在下面的例子中:

  • _backingValue包含"1234"
  • 当在<input>中输入"1234"时,计算的"1234"写入_backingValue
  • 在正常情况下,_backingValue 不会 通知任何订户值更改,因为 "1234" === "1234但是,因为我们明确告诉它总是触发 valueHasMutated "event",它 确实 通知它的订阅者。
  • formattedValueread 属性 依赖于 _backingValue.
  • 因为_backingValue通知我们它已经改变,格式化函数将再次运行,输出"1234$".
  • 在正常情况下,formattedValue 不会 通知任何订阅者值的更改,因为 "1234$" === "1234$"。但是,由于扩展,再次触发 valueHasMutated
  • <input>'s 值绑定接收更新并在屏幕上呈现 "1234$"

const _backingValue = ko.observable("1234")
  .extend({ notify: "always" });

const formattedValue = ko.computed({
  read: () => _backingValue().replace(/$/g, "") + "$",
  write: _backingValue
}).extend({ notify: "always" });


ko.applyBindings({ formattedValue });
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<input data-bind="value: formattedValue">