knockout.js

knockout.js - ¿Cuál es la diferencia entre ko.utils.unwrapObservable y ko.toJS?



(3)

Con respecto a ko.mapping.toJS(...) vs. ko.toJS(...)

ko. here .toJS ()

Esto creará un objeto no mapeado que contiene solo las propiedades del objeto mapeado que formaba parte de su objeto JS original. En otras palabras, se ignoran las propiedades o funciones que se agregaron manualmente a su modelo de vista. De forma predeterminada, la única excepción a esta regla es la propiedad _destroy que también se correlacionará, ya que es una propiedad que Knockout puede generar cuando destruye un elemento de un ko.observableArray. Consulte la sección "Uso avanzado" para obtener más detalles sobre cómo configurar esto.

Esto significa que el complemento de mapeo solo convierte las cosas que TI creó para usted. Si fusionó un modelo de vista o agregó observables calculados o incluso solo regulares, no volverán al modelo.

Si tiene un modelo de vista híbrido (parcialmente mapeado y parcialmente creado manualmente), es mejor crear el JSON para enviar de vuelta al servidor de forma híbrida.

Puede poner esto en su página para ver cómo difieren los dos modelos:

<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>

(No estaba seguro de cómo ''embellecer'' la respuesta de ko.mapping.toJSON así que acabo de usar JSON.stringify

¿Cuáles son las diferencias entre los 2?

Seguramente son lo mismo ya que un observable desenvuelto se reduce a un primitivo js. Entonces, ¿por qué ko.toJS o viceversa?

Además, ¿por qué hay un ko.mapping.toJS? ¿Esto no hace lo mismo que ko.toJS? Parece que hay varias funciones en knockoutJS que hacen lo mismo, pero debe haber una razón por la que existen.


Hay diferencias entre ellos.

El ko.toJS toma un objeto y se "abre" y limpia el objeto de todos los observables. Hace esto para todo el gráfico de objetos. Me comporto como un serializador, lo que significa que tendrá problemas si tiene referencias circulares, por ejemplo. Utiliza mapJsObjectGraph internamente, que es demasiado complejo para que compile completamente en mi cabeza en este momento. Sin embargo, tiendo a usarlo cuando necesito publicar cosas en el servidor.

ko.utils.unwrapObservable simplemente determina si el valor es observable y si lo es, devuelve el valor subyacente. Si no, solo devuelve el valor. Puede ser útil si está utilizando el complemento de mapeo, por ejemplo, donde puede terminar con modelos que pueden tener tanto observables como no observables.

ko.mapping.toJS es el único en la lista que podría sospecharse que está algo duplicado en términos de su funcionalidad. Se utiliza para asignar un gráfico de objeto mapeado a su estado original. Parece mucho menos complejo que ko.toJS, pero no lo he usado (todavía), así que honestamente no puedo contarte más sobre eso. Lea más sobre esto here .


así es como ko.mapping.toJS & 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__: .... }

Como puede ver, ko.mapping.toJS () devuelve un objeto JS limpio que refleja el modelo de vista,
Sin dejar ninguna propiedad knockout, mientras que ko.toJS () deja algunas propiedades knockout.

No estoy seguro de por qué lo hicieron de esa manera ...