我使用Stripe併爲了避免任何PCI遵從問題,我的表單上輸入的信用卡數據不應該從瀏覽器傳輸到服務器。用戶應使用Knockout.js將信用卡數據輸入到表單中。防止對象被Knockout.js序列化爲JS/toJSON
大部分爲了感興趣的問題(主要是我更好地理解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
功能,併成爲結束了。
這個想法幾乎可行 - 你可以從this jsFiddle看到。不幸的是,它只是第一次執行read()
,但它從未被調用過。我收集這是因爲沒有可觀察到的read
依賴於,所以淘汰賽假定計算值不會改變。
所以我想我好奇的兩件事情:
這是概念上是明智的方法去防止可觀察到的從
ko.toJS/toJSON
正在連載? (或者一般來說,只要在計算可觀察值上調用read
就具有函數執行)如何在每次訪問時調用計算變量的
read
函數(即避免緩存它)?
我只是好奇如何用Knockout.js去做這種事情。
感謝傑夫顯示:與
Object.create()
創建對象時例如。這當然是這個想法,並且這適用於排除密碼屬性的簡單情況。這不是我正在尋找的,因爲1)我想要一些可以放入可重用模型的通用庫的東西,2)這隻能省略一個觀測值,我想要一個明確的錯誤(而不是無聲的省略)整個ViewModel拒絕序列化,3)我認爲這不適用於'ko {mapping} .toJS/toJSON'。儘管感謝您爲討論做出貢獻! –
哦,所以你想要這個錯誤,即使在'toJS'函數。我認爲這是可行的,但不確定是否可行。 –