Ответ 2
Если ваша модель является "гибридной" моделью, которая не была полностью создана с использованием плагина сопоставления, то использование ko.mapping.toJSON
может не удалять свойства __ko_mapping__
, которые вы ожидаете.
Под "гибридной" моделью я имею в виду тот, который вы создали как обычный объект, а затем отобразили только части с ним с помощью плагина сопоставления.
Самое простое решение - добавить к каждому "классу" следующее, которое заканчивается нежелательными свойствами. Это удалит его, если вы используете mapping.toJSON
или ko.toJSON
.
Product.prototype.toJSON = function()
{
var copy = ko.toJS(this);
delete (copy.__ko_mapping__);
return copy;
}
Этот метод описан в Управление тем, как объект преобразован в JSON, хотя и не связан с плагиатом сопоставления.
Пример:
Вот некоторые JSON, которые закончили с нежелательным отображением, когда оно было сериализовано (даже с ko.mapping.toJSON
).
Я только что добавил вышеприведенный код к классу "product" (я использую typescript, поэтому я называю их классами).
{ "Код" : "3007", "всего": 0, "убывание" : "Описание", "кол-во": 0, "каждый": NULL, "грязный" ложь "removePending" ложь, "editableQty" : 0, "ItemUpdating" ложь " __ ko_mapping __": { "игнорировать": [], "включить": [ "_ уничтожить" ], "копия": [], "наблюдать": [], "mappedProperties": { "Артикул": истинный "QTY": истинные}, "copiedProperties": {}}}, { "Код" : "3008", "всего": 0, "по убыванию": "Описание", "кол-во": 0, "каждый": нулевой, "грязный" ложь "removePending" ложь "editableQty" : 0, "ItemUpdating" ложь " __ ko_mapping __": { "игнорировать": [], "включить": [ "_ уничтожить" ], "копия": [], "наблюдать": [], "mappedProperties": { "Артикул": правда, "ВО": правда }, "copiedProperties": {}}},
Впоследствии я получил этот намного более чистый JSON. Теперь я вернусь и delete(copy.removePending)
и delete(copy.itemUpdating)
, которые являются только моделью просмотра.
{ "Код" : "3007", "всего": 0, "убывание" : "Описание", "кол-во": 0, "каждый": NULL, "грязный" ложь "removePending" ложь, "editableQty" : 0, "ItemUpdating" ложь}, { "Код" : "3008", "всего": 0, "убывание" : "Описание", "кол-во": 0, "каждый": NULL, "грязный" ложь "removePending" ложь "editableQty": 0, "ItemUpdating" ложь},
Также обратите внимание, что вызов отображаемой версии toJSON
внутренне просто вызывает JSON.stringify(ko.mapping.toJS(object))
. Другими словами, ko.mapping.toJSON
является удобной функцией и не выполняет свою собственную стробировку.
// from mapping source code
exports.toJSON = function (rootObject, options)
{
var plainJavaScriptObject = exports.toJS(rootObject, options);
return ko.utils.stringifyJson(plainJavaScriptObject);
};
// from main knockout source code for `ko.utils`
stringifyJson: function (data, replacer, space) { // replacer and space are optional
if (!JSON || !JSON.stringify)
throw new Error("Cannot find JSON.stringify(). Some browsers (e.g., IE < 8) don't support it natively, but you can overcome this by adding a script reference to json2.js, downloadable from http://www.json.org/json2.js");
return JSON.stringify(ko.utils.unwrapObservable(data), replacer, space);
},