【问题标题】:How can I make Knockout.js not invoke functions when I call ko.toJS()当我调用 ko.toJS() 时,如何使 Knockout.js 不调用函数
【发布时间】:2014-07-21 06:12:44
【问题描述】:

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

这可能会导致明显的问题,例如 infinite loop,如果调用具有副作用的函数,最坏的情况是会导致数据损坏。

这种行为在早期版本的 Knockout 中曾一度改变,但似乎 it was backtracked upon 是设计使然,因为有时有些人希望复制函数。

嗯,我从不这样做(我不认为我这样做),我真的很感激能够调用 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?,但是如果我想保留对象而不是转换为字符串,我还没有找到解决方案。

【问题讨论】:

  • 或者可能以某种方式指定函数以忽略带有下划线的_incrementQty() 不会被调用

标签: knockout.js knockout-mapping-plugin to-json


【解决方案1】:

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

var mapping = {
    'ignore': ['load', 'reset', 'onSubmit']
};
var data = ko.mapping.toJS(object, mapping);

【讨论】:

  • 谢谢。当你有一个像我一样的对象图时,这会更棘手 - 我为视图模型中的每个元素构造“对象”,所以当它被序列化时,会有一个非常复杂的函数和数据树
  • 我必须承认,我很沮丧,因为他们“修复”了这个问题,然后又撤回了它,但现在就是这样!
【解决方案2】:

看起来这是一场虚惊。

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

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

如果我将 ko.toJSON(obj) 甚至 JSON.stringify(ko.toJS(obj)) 传递给 jQuery,那么它工作正常。

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多