Я хочу преобразовать viewModel в объект Json. Но я не хочу отображать вычисленные свойства.
Как я могу использовать метод ko.toJs без вычисленных свойств при отображении нокаута?
Ответ 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);