问题标签 [knockout-mapping-plugin]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
knockout.js - ko.mapping 创建函数,扩展对象
是否可以在映射过程中修改对象的(因为没有更好的术语)模式?我想它是,我似乎无法让它工作。我正在尝试这样的事情:
javascript - 带有 RequireJS 的 Knockout 映射插件:未捕获的错误:不匹配的匿名 define() 模块
我在将 knockout.mapping 插件与 RequireJS 结合使用时遇到了这个问题。基本上,托管我的应用程序的网站正在按此顺序加载 knockout、knockout.mapping 和 requirejs。
甚至没有做任何进一步的事情,我得到这个不匹配错误。是否有某种我没有意识到的顺序?
/// 更新 ///
我写了这两个测试:
基本上,您看到的是,如果我在映射插件之前自行将 require.js 加载到我的项目中,那么映射插件将变得不可见。我认为这与映射插件如何使用 require 来要求淘汰有关......但我无法确定它失败的原因。
/// 第二次更新 ///
看来这个场景在这里很重要,所以我将提供更多的背景信息。
想象一个在脚本标签中定义了 knockout.js 和 knockout.mapping.js 的 Web 应用程序。然后第三方小部件加载到页面中,该页面使用 requireJS 来建立它的依赖关系。正是这种加载似乎导致了问题。由于某些库是通过老式的手动方式加载的,而其他库是使用 require 加载的,因此 require 似乎与现有库的上下文相混淆。
如果我从主机应用程序中删除对 require 的引用,那么当我回来查看 ko.mapping 是否存在时会出现错误。这显然是因为该小部件对淘汰赛做了一个要求,这以某种方式破坏了它与映射插件的关系。
我想我需要一个非常熟悉 RequireJS 的人来评论堆叠这些库。显然,当我为匿名消费创建小部件时,我不知道消费者如何或是否使用 requireJS。
/// 第三次更新 /// 尽量澄清问题,也许这会更有意义:
是否有任何明确定义的模式可以将使用 RequireJS 的小部件注入到现有网页中,手动加载资源?这似乎是不可能的,因为 RequireJS 只会双重加载传统页面可能已经加载的任何内容。
knockout.js - Knockout.js 映射不绑定子模型
我遇到了 knockout.js 的问题,并且映射插件没有为源数据中的子数组创建模型
(这是我可以为此做的一个小回购。这里提供小提琴:http: //jsfiddle.net/msieker/6Wx3s/)
简而言之,永远不会调用 InnerModel 构造函数。我已经尝试过'InnerModel'
它在这个片段中的位置和'inner'
映射中的位置。从我所看到的大多数情况来看,这应该可以正常工作,但显然我错过了一些东西。
任何人都有这方面的经验,可以为我指明正确的方向吗?
编辑: 根据@John Earles 的回答,我已经得到了更接近我需要的东西:
但是,parent
传递给 InnerModel 的是null
,这就是我追求映射插件的全部原因。文档让我相信这应该被传递options
给函数的参数create
,但是我得到了一个observable
其值为null
. 在这个方向上还有什么额外的指示吗?
jquery - knockout.js:如果 AJAX 调用在用户控件中,则保存视图模型的位置
我很难理解当用户在页面上时我在哪里保留视图模型。我有几个用户控件发出 AJAX 请求并将绑定应用于用户控件中的控件。我正在使用映射插件来填充我的视图模型。我在页面上有 4-5 个用户控件。我正在努力将视图模型保存在内存中,以便它可以检测到更改并将其发送回服务器。截至目前,我将它们保存在 window.Model1 属性中,这不是一个好主意。
有人可以告诉我将视图模型保存在内存中以便我可以检测到更改的最佳方法是什么?还是我做错了,有更好的方法来处理这种情况。
这是所有这些的代码。
用户控制:
页面:
网络服务:
客户型号:
knockout.js - 淘汰应用程序的性能调整 - 改进响应时间的指南
我有一个大而复杂的页面,它严重依赖于 knockout.js。性能开始成为一个问题,但检查调用堆栈并试图找到瓶颈是一个真正的挑战。
我在另一个问题(Knockout.js -- 理解 foreach 和 with)中注意到接受的答案有评论:
...我建议不要
with
在需要高性能的地方使用,因为开销...
假设该陈述是正确的,那么这确实是非常有用的知识,而且我还没有找到此类性能提示的来源。
因此,我的问题是:
在深入研究经典性能调优之前,是否有可以应用的一般指南/重要提示来帮助提高我的应用程序的性能。
knockout.js - 如何使用映射插件进行淘汰赛?
我写了以下代码
JSON 数据如下所示:
我应该如何写这html
部分?
我对javascript很陌生。请帮忙。
jquery - 使用敲除映射插件进行节流
我在使用 IE8 的淘汰赛映射插件时遇到问题。我们的情况是我们发送了所有可以显示给客户的可能记录。然后我们在客户端处理响应式系统的所有分页和过滤。
目前,我们正在发送一个包含 250 条记录的列表,以通过 jQuery ajax 在基于 jQuery 模板的网格中显示。当我们调用 ko.mapping.fromJS(不是 fromJSON 函数)来映射对象时,我们会从 IE8 收到“脚本耗时过长”的消息。在 FF 和 Chrome 中不会发生,因为它们的 java 脚本执行得更快。
是否有直接的方法来限制映射?这是一个长期问题,因为我们可能会遇到将近 1000 条记录要发送给客户的情况。
json - 将 JSON 数据映射到具有特定视图模型类型的 Knockout observableArray
有没有办法将 JSON 数据对象映射到可观察数组,然后依次将可观察数组的每个项目初始化为特定类型的视图模型?
我查看了所有淘汰赛的文档以及此处的淘汰赛和映射示例,但我找不到任何适合我所追求的答案。
所以,我有以下 JSON 数据:
我有以下视图模型:
是否有可能使用给定的数据结构并使用淘汰赛的映射插件,让生成的 StateViewModel 包含一个填充有 2 个 CityViewModels 的 observableArray,并且每个 CityViewModel 包含一个填充有 2 个 StreetViewModels 的 observableArray?
目前使用映射插件,我能够将其映射到 StateViewModel,但是“城市”和“街道”集合填充了通用对象,而不是我的城市和街景模型的实例。
它们最终得到了正确的可观察属性和值,它们不是我的视图模型的实例,这就是我所追求的。
javascript - 如何处理 Knockout.js 映射器混蛋?
我正在使用 Knockout.js 上的映射器插件来处理来自服务器的 JSON。我已经设置了父母和孩子,但是有些孩子没有父母。这些流浪儿童需要一个处理程序将它们放入新的父母或模型中,例如“养父母”,并有办法访问养父母并在单独的列表中使用“foreach”进行迭代。
这是我到目前为止的代码示例:http: //pastie.org/3708368
处理程序将去哪里寄养?或者我可以在父母之前安排一个特殊的养父母吗?
基本用例是孩子是未分配的任务(提供上下文)。
感谢您的输入!
knockout.js - 对复杂 JSON 使用 Knockout 映射
大多数 Knockout 看起来非常直观。对我来说奇怪的一件事是映射插件的工作原理。我期待/希望我能够从 ajax 调用中为其提供 JSON,并拥有一种可在我的 HTML 中引用的“动态”视图模型。
映射插件的描述甚至听起来像是它的工作原理:
“如果您的数据结构变得更加复杂(例如,它们包含子对象或包含数组),手动处理会变得非常麻烦。映射插件允许您创建从常规 JavaScript 对象(或 JSON 结构)到可观察对象的映射查看模型。”
但看起来您实际上需要首先在代码中定义视图模型,然后您可以在事后使用映射插件和一些 JSON 数据来填充它。这是正确的吗?
我试图做的一个具体例子。
我正在尝试将 Knockout 与 Solr(返回 JSON 搜索结果的搜索引擎)一起使用。Solr 返回的 JSON 数据的骨架结构为:
事实上,这就是我第一次设置映射视图模型时输入的结构。
只是为了让您了解一些关于 JSON 数据如何从 Solr 返回的信息: response.docs 数组包含一个哈希数组,其中哈希数据由索引文档数据的键/值组成。数组中的每个哈希都是在搜索结果中返回的一个文档。
那部分似乎映射得很好。
JSON 的“突出显示”部分是导致我出现问题的原因。当我尝试在我的 HTML 中引用突出显示的字段时,我得到了 ReferenceErrors。以下是 JSON 中突出显示字段的示例:
我的 HTML 中有一个 foreach 尝试解析每个 response.docs 元素,如果对象的突出显示部分包含与该文档的 Id 字段匹配的内容,我想替换突出显示的标题而不是默认标题。(在下面的代码中,“结果”是我将 JSON 映射到的视图模型的名称。)
当我尝试使用它时,我总是收到此错误:
我已经尝试过如何引用数据的变化,但我似乎无法访问它。
编辑我正在取得一些进展。在我的映射定义中,我现在指定“突出显示”,如下所示:
而不仅仅是将突出显示设置为 {}。现在,当我进行映射时,我至少能够稍微查看一下突出显示的数据。然而,我仍然看到奇怪的错误。
我已经简化了我的测试 HTML 代码,只为每个搜索结果吐出突出显示的数据:
现在返回多个<pre>
标签,如下所示:
但是,如果我将该 HTML 代码更改为:
我继续收到这样的错误:
对我来说毫无意义!我之前的测试表明,可用的数据确实包含“标题”键,为什么我不能访问该数据?
编辑我创建了一个 jsfiddle,但当然......它按预期工作。我无法在 jsfiddle 上重现我的问题。:-(
编辑好吧,我在这里取得了一些进展,但我仍然对发生的事情感到非常困惑。首先,我将调试 HTML 更改为:
然后我提交了我的 ajax 调用,我在 Chrome 控制台中注意到了这个输出:
因此,由于某种原因,foreach
循环在 3 个 Results.response.docs 上循环,前两个没有映射到我的 highlight() 对象中的任何内容,所以它们返回未定义——这就是我尝试拉 .Title 的原因财产失败。
为了确认这一点,我ko if: $root.Results.highlighting()[Id()]
在该块周围包裹了一个,最终能够在 foreach 循环期间访问 .Title 属性,而不会出现 JS 错误。
这仍然给我留下了为什么/如何有 3 个 Results.response.docs 对象被循环的问题。也许 foreach 绑定正在运行 3 次,前 2 次突出显示对象是空的,第三次,它终于被填充了?但我很难弄清楚为什么会这样。
另一个可能的线索:如果我第二次触发 ajax 调用,而不重新加载页面,我可以看到这 3 个“通过”每次都在控制台日志中返回一个有效的对象。所以不是两个undefined
s 和一个 Object ,而是三个 Object 都排成一行。
但是,在我的 HTML 输出中,我只看到一行数据。所以这似乎证明它不是循环超过 3 个元素,而是实际上运行了 3 次。问题仍然存在……为什么?