复制相同值两次时可写计算变量不读取值
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",它 确实 通知它的订阅者。
formattedValue
的 read
属性 依赖于 _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">
我正在将输入格式化为货币并使用可写计算变量将值更新回文本框。
例如我有一个值 1234.12
我正在从记事本中复制值并将其粘贴到文本框中,在选项卡上它正在点击读取功能并将其格式化为货币并以 $1,234 的形式写回文本框。 当我粘贴相同的值 1234 时,它没有命中读取,而是直接按原样写入文本框,作为 1234 标签输出。
我在js中也遇到过这个问题
如果我多次粘贴相同的值,你知道如何设置值的格式吗?
您可以使用 { notify: "always" }
扩展器来确保您的数据始终得到格式化。
在下面的例子中:
_backingValue
包含"1234"
- 当在
<input>
中输入"1234"
时,计算的将"1234"
写入_backingValue
- 在正常情况下,
_backingValue
不会 通知任何订户值更改,因为"1234" === "1234
。 但是,因为我们明确告诉它总是触发valueHasMutated
"event",它 确实 通知它的订阅者。 formattedValue
的read
属性 依赖于_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">