Использование fromJS для массива с пустыми строками заменит эти строки на false - PullRequest
2 голосов
/ 28 июля 2011

Когда отображается объект ниже, пустые значения "" в массиве отображаются как ложные в наблюдаемом массиве:

var d2 = {
    "values": [{"9", false, "", true, null, "", "", ""]
};

var viewmodel2 = ko.mapping.fromJS(d2);

При отображении обратно в JSON с использованием ko.mapping.toJSON(viewmodel2); это результат:

{ "values": [
    "9",
    false,
    false,
    true,
    null,
    false,
    false,
    false] }

Обратите внимание, что последние 3 строковых значения из массива конвертируются обратно в false.

Это ошибка? или массивы, содержащие bools и строки, не поддерживаются

Вот для этого скрипка .

Ответы [ 2 ]

2 голосов
/ 02 августа 2011

Это действительно было ошибкой и теперь исправлено.Это было вызвано двумя причинами:

  • Сравнение равенства, чтобы увидеть, какие ключи содержались в массиве, использовало оператор "==" вместо "===", поэтому он считал "ложным" и«» - это тот же ключ.
  • Во-вторых, я сортирую все ключи в массиве как часть логики обработки дубликатов ключей.Однако это не то, что следует делать, если вы явно не предоставляете обратный вызов ключа, поскольку в этом случае вы, вероятно, заботитесь о порядке элементов.

Последняя версия, 1.2.3, доступен на GitHub, также был создан пакет NuGet.Репродукция jsfiddle, любезно созданная Srluisreyes, теперь тоже работает!

1 голос
/ 01 августа 2011

Кажется, это определенно ошибка.

Я раздвоил ваш код jsFiddle и обнаружил, что проблема, кажется, заключается в том, что когда метод toJSON начинает анализировать объект, он принимает первый ("" или false) и обрабатывает каждый второй ("" или false) как найденный начальный. .

Если в этом нет особого смысла, попробуйте изменить значение false в начале объекта на «» и наоборот в этом jsfiddle. http://jsfiddle.net/5HhMn/

Возможно, вы захотите опубликовать об этой проблеме на странице github Стива Сандерсона. https://github.com/SteveSanderson/knockout.mapping

...