我正在使用Stripe,为了避免任何与 PCI 合规性相关的问题,我的表格中输入的信用卡数据绝不应该从浏览器传输到服务器。用户应使用 Knockout.js 将信用卡数据输入表单。
主要是出于兴趣(主要是为了让我更好地了解 knockout.js 的工作原理),我想提出一种方法来防止信用卡数据的序列化,方法是在尝试序列化数据时发生显式错误通常的 knockout.js 方式(即ko.toJS
或ko.toJSON
或ko.mapping.*
等价物)。
为了实现这一点,我认为我可以做一些聪明的事情,比如(在 CoffeeScript 中):
class NeverSerialize
datums = ko.observable()
blocker = ko.computed(
read: () -> throw new Error("You shall not pass!")
deferEvaluation: true
)
并且当ko.toJS/toJSON
调用或等效调用时,它将执行blocker()
并且将调用该read
函数并结束它。
这个想法几乎可行 - 正如您从这个 jsFiddle中看到的那样。不幸的是,它只read()
在第一次执行,但它从未被调用过。我认为这是因为没有可观察的read
依赖,所以淘汰赛假定计算的值不会改变。
所以我想我对两件事感到好奇:
从概念上讲,这是否是防止可观察对象被序列化的明智方法
ko.toJS/toJSON
?(或者,一般来说,只要read
在计算的 observable 上调用 a ,就执行一个函数)如何在每次访问计算变量
read
时调用它的函数(即避免缓存它)?
我只是好奇如何使用 Knockout.js 来处理这种事情。