2?
之间有什么区别?当然,它们是相同的东西,因为一个未包装的可观察条带向下到js原语。那么为什么要ko.toJS反之亦然?
另外,为什么有ko.mapping.toJS?这与ko.toJS有效吗? 在knockoutJS中似乎有几个函数做同样的事情,但必须有它们存在的原因。
答案 0 :(得分:43)
它们之间存在差异。
ko.toJS接受一个对象并“打开”并清除所有可观察对象。它为整个对象图执行此操作。我的行为很像一个序列化程序,这意味着如果你有循环引用,你会遇到问题。它在内部使用mapJsObjectGraph,这对我来说太复杂了,我现在无法完全编译。但是,当我需要将东西发回服务器时,我倾向于使用它。
ko.utils.unwrapObservable只是确定该值是否为可观察值,如果是,则返回基础值。如果不是,它只返回值。如果您正在使用映射插件,那么它可能很方便,例如,您可能最终得到可以同时具有observable和不可观察的模型。
ko.mapping.toJS是列表中唯一可能被怀疑在其功能方面有些重复的人。它用于将映射的对象图形映射回其原始状态。它看起来比ko.toJS复杂得多,但是我还没有使用过它,所以老实说我不能告诉你更多关于那个的信息。阅读更多相关信息here。
答案 1 :(得分:7)
关于ko.mapping.toJS(...)
与ko.toJS(...)
这将创建一个仅包含属性的未映射对象 作为原始JS对象一部分的映射对象。所以 换句话说,您手动添加到的任何属性或功能 您的视图模型将被忽略。默认情况下,这是唯一的例外 rule是_destroy属性,也将被映射回来,因为 它是Knockout在您销毁物品时可能生成的属性 来自ko.observableArray。有关详细信息,请参阅“高级用法”部分 有关如何配置此内容的详细信息。
所以这意味着映射插件只会转换IT为您创建的内容。如果您已合并视图模型或添加计算或甚至只是常规可观察量,则他们不会将其恢复到模型。
如果您有混合视图模型(部分映射并部分手动创建),您可能最好创建JSON以混合方式发送回服务器。
您可以在页面上显示这两个模型的不同之处:
<h2>ko.TOJSON()</h2>
<pre data-bind="text: ko.toJSON($root, null, 2)"></pre>
<h2>ko.mapping.toJS</h2>
<pre data-bind="text: JSON.stringify(ko.mapping.toJS($root), null, ' ')"></pre>
(我不确定如何对来自ko.mapping.toJSON
的回应进行美化,所以我只使用了JSON.stringify
答案 2 :(得分:4)
这就是ko.mapping.toJS&amp; ko.toJS:
var viewModelRaw = { prop: 0 };
var viewModel = ko.mapping.fromJS(viewModelRaw);
var _raw = ko.mapping.toJS(viewModel); // = { prop: 0 }
var _rawWithTraces = ko.toJS(viewModel); // = { prop: 0, __ko_mapping__: .... }
如您所见,ko.mapping.toJS()返回一个反映视图模型的干净JS对象,
没有留下任何淘汰属性,而ko.toJS()留下一些淘汰属性..
我不确定他们为什么这样做......