Подтвердить что ты не робот

Какая разница между ko.utils.unwrapObservable и ko.toJS?

В чем разница между 2?

Конечно, это то же самое, что и развернутые наблюдаемые полосы вплоть до примитива js. Итак, почему есть ko.toJS или наоборот?

Кроме того, почему существует ko.mapping.toJS? Не делает ли это фактически то же самое, что и ko.toJS? Кажется, в нокауте есть несколько функций, которые делают то же самое, но должна быть причина, по которой они существуют.

4b9b3361

Ответ 1

Между ними существуют различия.

ko.toJS берет объект и "открывает" и очищает объект от всех наблюдаемых. Он делает это для всего графа объектов. Я веду себя так же, как сериализатор, что означает, что вы столкнетесь с проблемами, если у вас есть циклические ссылки, например. Он использует mapJsObjectGraph внутри, что слишком сложно для меня, чтобы полностью скомпилировать в моей голове прямо сейчас. Тем не менее, я, как правило, использую его, когда мне нужно отправить материал обратно на сервер.

ko.utils.unwrapObservable просто определяет, является ли это значение наблюдаемым, а если оно есть, оно возвращает базовое значение. Если нет, он просто возвращает значение. Это может быть удобно, если вы используете плагин сопоставления, например, где вы можете получить модели, которые могут иметь как наблюдаемые, так и не наблюдаемые.

ko.mapping.toJS является единственным в списке, который, как можно предположить, несколько дублируется с точки зрения его функциональности. Он используется для сопоставления отображаемого графика объекта с его исходным состоянием. Это выглядит намного менее сложным, чем ko.toJS, но я не использовал его (пока), поэтому я честно не могу рассказать вам больше об этом. Подробнее об этом здесь.

Ответ 2

Относительно ko.mapping.toJS(...) vs. ko.toJS(...)

ko. mapping.toJS()

Это создаст неотобранный объект, содержащий только свойства отображаемый объект, который был частью вашего исходного объекта JS. Итак, в другими словами, любыми свойствами или функциями, которые вы вручную добавили в ваша модель просмотра игнорируется. По умолчанию единственным исключением из этого правило - свойство _destroy, которое также будет отображаться обратно, потому что это свойство, которое Knockout может генерировать, когда вы уничтожаете элемент из ko.observableArray. Дополнительную информацию см. В разделе "Расширенное использование" подробности о том, как настроить это.

Итак, это означает, что плагин сопоставления только преобразует назад то, что создано для вас. Если вы объединили модель представления или добавили вычисленные или даже обычные наблюдаемые данные, они не вернутся к модели.

Если у вас есть гибридная модель просмотра (частично отображаемая и частично созданная вручную), вам может быть лучше всего создать 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

Ответ 3

вот как 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__: .... }

Как вы можете видеть, ko.mapping.toJS() возвращает чистый объект JS, отражающий модель представления,
Не оставляя никаких свойств нокаута, в то время как ko.toJS() оставляет некоторые свойства нокаута.

Я не уверен, почему они это сделали...