1

我已经使用 knockout.js 几个月了,只是ko.toJS在序列化我的模型时才意识到它在调用时调用了函数。

这可能会导致明显的问题,例如无限循环,如果正在调用具有副作用的函数,最坏的情况是会导致危险的数据损坏。

这种行为在早期版本的 Knockout 中曾一度改变,但似乎它被认为是设计使然,因为有时有些人希望复制功能。

好吧,我从不这样做(我不认为我这样做),我真的很感激一种能够调用toJS不会调用我的函数的方法。

我意识到我可以toJSON改用,但有时你真的想要toJS在你想做这样的事情的情况下:

toJSON = () =>     // this is typescript syntax
{
     var copy = ko.toJS(this);

     // remove credit card details if not selected payment type
     if (this.paymentType() != 'CreditCard')
     {
         delete copy.creditCardDetails;
     }

     return copy;
}

或者也许我正在将模型传递给需要对象的一些实用方法。

我想我最终不明白为什么我的视图模型上的函数调用是不可配置的,如果有一种简单的方法可以“猴子补丁”或创建一个新toJS2函数,那么我真的很想能够做到这一点。

这个问题中有一些非常有用的信息,How can I use ko.toJs method without computed properties in knockout mapping? 但是到目前为止,如果我想保留对象而不是转换为字符串,我还没有找到解决方案。

4

2 回答 2

3

为了将来参考(我有时也遇到过同样的问题),您可以创建一个映射来忽略方法:

var mapping = {
    'ignore': ['load', 'reset', 'onSubmit']
};
var data = ko.mapping.toJS(object, mapping);
于 2014-07-21T08:09:01.130 回答
0

看来是虚惊一场。

虽然toJS确实保留了函数引用,但调用它们的不是 Knockout 本身。

我将数据直接传递给 jQuery 的 ajax 函数以发出 POST 请求,实际上是 jQuery 的 JSON 序列化导致了调用。

如果我通过ko.toJSON(obj)或什JSON.stringify(ko.toJS(obj))至通过 jQuery,那么它工作得很好。

于 2014-07-21T06:42:40.480 回答