ko.utils.unwrapObservable和ko.toJS之间有什么区别?

jaf*_*ffa 31 knockout.js

2之间有什么区别?

当然,它们是相同的东西,因为一个未包装的可观察条带下降到一个js原语.那么为什么要ko.toJS反之亦然?

另外,为什么有ko.mapping.toJS?这与ko.toJS有效吗?在knockoutJS中似乎有几个函数可以做同样的事情,但必须有它们存在的原因.

Mik*_*erg 43

它们之间存在差异.

ko.toJS需要一个对象,"打开",并清除所有观测对象.它为整个对象图执行此操作.我的行为很像一个序列化程序,这意味着如果你有循环引用,你会遇到问题.它内部使用mapJsObjectGraph,这对我来说太复杂了,我现在无法完全编译.但是,当我需要将东西发回服务器时,我倾向于使用它.

所述ko.utils.unwrapObservable简单地确定该值是可观察到的,并且如果是,则返回基础值.如果不是,它只返回值.如果您正在使用映射插件,那么它可能会很方便,例如,您可能最终得到可以同时具有observable和不可观察的模型.

ko.mapping.toJS是可能被怀疑在其功能方面有所重复的名单上唯一的一个.它用于将映射的对象图形映射回其原始状态.它看起来比ko.toJS复杂得多,但我还没有使用它(但是)所以老实说我不能告诉你更多关于那个的.在这里阅读更多相关信息.

  • 我认为它现在是ko.unwrap而不是ko.utils.unwrapObservable. (3认同)

Sim*_*ver 7

关于ko.mapping.toJS(...)vs.ko.toJS(...)

KO.映射 .toJS()

这将创建一个未映射的对象,该对象仅包含作为原始JS对象一部分的映射对象的属性.换句话说,您手动添加到视图模型的任何属性或函数都将被忽略.默认情况下,此规则的唯一例外是_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>
Run Code Online (Sandbox Code Playgroud)

(我不知道怎么'美化'反应,ko.mapping.toJSON因此我只使用了JSON.stringify