Как я могу использовать метод ko.toJs без вычисленных свойств при отображении нокаута?

Я хочу преобразовать viewModel в объект Json. Но я не хочу отображать вычисленные свойства.

Ответы

Ответ 1

Вот несколько вариантов, если вы собираетесь конвертировать их в JSON:

  • если вы используете функции-конструкторы для своего объекта, вы можете переопределить функцию .toJSON, чтобы контролировать, какие свойства вывести. Вот статья на нем: http://www.knockmeout.net/2011/04/controlling-how-object-is-converted-to.html. Вот пример: http://jsfiddle.net/rniemeyer/FE4HX/.

  • в KO 2.1, при использовании ko.toJSON второй и третий аргументы теперь передаются в JSON.stringify. Вот несколько документов по аргументам: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/JSON/stringify. Это означает, что вы можете передать второй аргумент (replacer) либо массивом свойств для включения, либо функцией, которая обрабатывает ключ/значения. Вот такой же пример, используя этот метод: http://jsfiddle.net/rniemeyer/huyLe/.

  • Другим вариантом, который я часто использую, является определение вычислений, которые вы не хотите в своем JSON-выходе в качестве суб-наблюдаемых. Обсерватории - это функции, которые являются объектами, поэтому вы можете фактически определять наблюдаемые на наблюдаемых. Как:

-

this.name = ko.observable("Bob");
this.name.formatted = ko.computed(...);

Теперь, когда преобразование в JSON, formatted будет естественно потеряно, поскольку name преобразуется в его значение. Здесь снова повторяется один и тот же образец: http://jsfiddle.net/rniemeyer/peEGG/. Обычно я использую это, когда это метаданные об наблюдаемом (isValid, isEditing и т.д.).

Ответ 2

Это также сработает, оно просто проигнорирует что-либо с "mappedProperties" в нем, поскольку утильщики типа утиного помнят, что вы не должны были отображать свойства как часть вашего кода, так как вы используете нокаут. Поэтому он должен работать.

/* Use this serializer function along with ko.toJS to produce clean JSON objects. */
ko.toJS2 = function (model)
{
     return JSON.parse(ko.toJSON(model, modelSerializer));
}

function modelSerializer(key, value)
{
if (isSerializable(value))
    return value;
else
    return;
}

function isSerializable(object) {
    if (object == null) return true;
    if (typeof object == 'function') return false;
    if (object.mappedProperties != null) return false;

    return true;
}

Использование:

var goodLookingJson = ko.toJS2(whateverModel);