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

Ko.toJSON создает некоторые нежелательные свойства copiedProperties

Я нахожу, что ko.toJSON создает некоторые нежелательные вещи вроде:

copiedProperties уничтожить

{"test":1,"AppStart":true,"requestedDateFormat":"YYYY-MM-DD","__ko_mapping__":{"ignore":[],"include":["_destroy"],"copy":[],"observe":[],"mappedProperties":{"test":true,"AppStart":true,"requestedDateFormat":true},"copiedProperties":{}}}

В чем смысл? могу ли я удалить их по умолчанию?

4b9b3361

Ответ 1

Если вы используете плагин KO mapping, вы должны использовать методы преобразования плагинов, например.

ko.mapping.toJSON

и   ko.mapping.toJS

вместо встроенных ko.toJSON и ko.toJS.

Поскольку версия отображения методов будет принимать дополнительные свойства, которые, кстати, используются внутри самого плагина.

Демо JSFiddle.

Ответ 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);
},