将淘汰对象转换为纯 JavaScript 对象时出现无限循环

2024-04-07

遵循中给出的说明文档 http://knockoutjs.com/documentation/json-data.html,我有以下视图模型:

var newContactViewModel = function () {
    var self = this;

    self.Name = ko.observable();
    self.Address = ko.observable();
    self.City = ko.observable();
    self.State = ko.observable();
    self.PostalCode = ko.observable();

    self.Save = function () {
        $.ajax({
            type: "POST",
            url: "/contact",
            data: ko.toJS(self), //infinite loop here
            success: state.OnSaved
        });
    };
};

当。。。的时候self.Save调用方法时,会发生无限循环。 Chrome 实际上将错误报告为:

未捕获的范围错误:超出最大调用堆栈大小

如果我使用ko.mapping.toJS(self)代替ko.toJS(self),然后我得到一个稍微更明显的错误,但没有真正的错误“消息”:

如果我交换ko.toJS(self)出类似的东西{ Name: self.Name(), Address: self.Address() /* etc */ },然后一切正常。看起来它正在尝试转换Save方法并重新调用该方法作为结果。

要么是 KnockoutJS 中存在错误,要么是我使用它时出现了问题。我更喜欢后者。想法?


我发现了代码的问题。ko.toJS保留对象中的函数,以便能够很好地映射它。然而,jquery 将调用数据对象上的所有函数来尝试获取值。这反过来又导致无限循环。

您需要标记Save函数不被映射。不幸的是toJS函数似乎无法做到这一点。它将保留对象的所有成员。幸运的是,映射插件允许您做到这一点。

要排除成员,请设置ignore包含数组的选项'Save'它会忽略Save映射时的成员。

var data = ko.mapping.toJS(self, {
    ignore: ['Save']
});

如果您不使用映射插件,您始终可以选择删除Save来自 JS 对象的函数。

self.Save = function () {
    $.ajax({
        type: "POST",
        url: "/contact",
        data: self.ToData(),
        success: state.OnSaved
    });
};
self.ToData = function () {
    var data = ko.toJS(self);
    delete data.Save; // remove functions
    delete data.ToData;
    return data;
};

另一方面,我建议不要尝试使用视图模型实例作为调用的数据。我会显式创建数据对象。当然,它有可能会很长,但这是一种很可能永远有效的方法。

self.ToData = function () {
    return ko.toJS({
        Name: self.Name,
        Address: self.Address,
        City: self.City,
        State: self.State,
        PostalCode: self.PostalCode
    });
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将淘汰对象转换为纯 JavaScript 对象时出现无限循环 的相关文章

  • 在 TypeScript 中淘汰 observableArray

    在 TypeScript 类中初始化 Knockout observableArray 的正确方法是什么 我正在做这样的事情 module ViewModel declare var ko export class IndexPageVie
  • 敲除剑道问题通过计算的可观察值进行绑定

    我尝试使用knockout kendo js 在knockout forEach 模板中声明kendo dropdownlist 控件 以便当新项目添加到knockout 可观察数组时 新的kendo dropdownlist 会在UI 中
  • 在模板内对 $data 进行双向绑定

    我正在尝试设置通用的 Knockout 模板 可以根据数据类型在编辑和只读模式之间切换 如果您曾经使用过 ASP NET 的动态数据 它就像它们的字段模板 例如 这是这样使用的
  • 根据控制器响应动态更改视图部分

    我正在寻找以下场景的最佳方法建议 用户可以选择一个或多个 csv 文件进行验证 附件 1 单击 验证 按钮会执行验证代码 显示进度条 直到返回输出 返回响应可以是成功消息 也可以是选择验证的每个文件的错误详细信息 附件 2 现在可以使用 上
  • 正确处理浏览器资源

    我有一个网络应用程序 可以在很长一段时间内动态加载数据 数据内有图像的链接 然后在浏览器中呈现这些图像 e g var object Name ko observable Foo Ref ko observable Bar ImageUrl
  • Knockout 无法处理绑定

    当文本未定义时如何绑定文本 例如名称不可用 table class table thead tr th class col md 4 ID th th class col md 4 Name th tr thead tbody tr td
  • 使用带淘汰赛的引导按钮下拉菜单

    我正在尝试使用 Bootstrap 的精美样式按钮下拉菜单 http getbootstrap com components btn dropdowns淘汰赛 不幸的是 下拉菜单是使用链接而不是
  • 使用 Knockout 将任何键(通过键码)绑定到操作

    我正在寻找一种方法将许多不同的键绑定到我的视图模型中的不同操作 功能 我找到了这个example http geekswithblogs net michelotti archive 2011 10 11 knockoutjs custom
  • KnockoutJS 的购物车逻辑(?)问题

    The Goal 制作动态产品列表 场景 我有一个包含产品的购物应用程序 当我点击add button的产品 我想在侧边栏中显示我添加的产品 问题总结 您只需阅读此内容 我的代码中有以下代码ProductsSummary Index csh
  • 制作一个没有 new 关键字的 javascript 淘汰视图模型

    我正在浏览淘汰教程 所有示例都使用 new 关键字创建视图模型 from learn knockoutjs com function AppViewModel this firstName ko observable Bert this l
  • 如何使用淘汰赛映射插件添加新项目

    我正在尝试一个淘汰制图样本 我想我已经快完成了 我似乎无法向 viewModel foos 添加新的 Foo 谁能看到我在这里错过了什么 var Foo function data var self this self id data id
  • 单击鼠标更改 Knockout.js 中的 css 类

    Knockout js 文档显示了这样的 css 绑定 div Profit Information div 我需要对其进行调整以更改鼠标单击时的 css 类 我怎样才能做到这一点 根据下面的答案 我正在使用这样的代码 CSS class
  • Breeze 和 Knockout 中的验证

    我最近使用 Knockout 和 ASP NET MVC4 将 Breeze 添加到项目中 我真的很喜欢 Breeze 它节省了大量的编码工作 我使用过 Knockout 验证 喜欢它如何验证数据输入时的属性字段文本框以及错误消息的显示方式
  • 暂停 knockout.js 1.2.1 中的绑定

    淘汰赛中有暂停和恢复绑定的选项吗 版本 knockout js 1 2 1 我们需要暂停绑定的原因如下 在某些操作过程中 我们必须从服务器加载大量数据 例如 多个选择的整个数据都已更改 有些表的行是动态添加的等 现在 在当前场景中 表单与视
  • 淘汰赛js和全球化

    我不知道如何使用淘汰赛 js 和非美国语言环境来处理计算 我的逗号是 并且使用 jquery globalization 插件正确验证 但淘汰计算给我一个 NaN knockout js 是否以任何方式支持这一点 或者是否存在任何解决方法
  • KnockoutJS - 打印迭代索引作为输入名称

    我正在尝试结合 Spring MVC 创建我的第一个 KnockoutJS 表单视图 ModelAttribute捆绑 数据通过 Ajax 加载并使用 KnockoutJS 填充 通过 KnockoutJS 添加数据 通过 Ajax 和 K
  • 如何将复选框绑定到值的倒数?

    我有一个情况 当我需要将一个复选框和另一个 DOM 元素的可见性绑定到我的 viewModel 的布尔属性的逆时
  • 使用 knockout.js 防止双击按钮

    禁用按钮以便 Knockout js 不会发生双击的最佳方法是什么 我有一些用户快速点击导致多个 ajax 请求 我认为 knockout js 可以通过多种方式处理这个问题 并希望看到一些替代方案 使用信号量 旋转锁 基本上 您计算一个元
  • Knockout :找出哪个可观察触发了计算

    我有一个具有多个可观察值的对象 计算中有没有一种方法可以知道哪些可观察的变化 从而知道哪个可观察触发了计算 先感谢您 马修 如果没有详细说明您想要实现的目标 我将发布此内容 希望它能有所帮助 跟踪更改的一个简单方法是使用 subscribe
  • Typescript 中此子范围的问题

    This is ALMOST和其他人一样this到目前为止 我已经读过范围界定问题 除了一个细微的差别之外 这使得提出这个问题变得有意义 imo 现在最初我的问题是范围this使用 Knockout 和 Typescript 因此给出以下内

随机推荐