Knockout.mapping, IE9 и сериализация

При использовании нокаута (2.1.0) и нокаута (2.1.2) в IE9 возникла небольшая загадка. По какой-то причине индексы массива объектов превращаются в родительские объекты. Например:

ko.mapping.toJSON(attachments);

создает что-то похожее на это в Chrome:

{
    "UserID": 432,
    "Attachments": [{
        "AttachmentID": 2,
        "OwnerID": 321,
        "DisplayName": "sample.pdf",
        "Description": "desc",
        "PostDate": "2012-06-01T09:24:43.817"
        }, {
        "AttachmentID": 3,
        "OwnerID": 432,
        "DisplayName": "sample3.pdf",
        "Description": "desc",
        "PostDate": "2012-06-05T14:01:00.693"
        }, {
        "AttachmentID": 4,
        "OwnerID": 543,
        "DisplayName": "sample2.pdf",
        "Description": "desc",
        "PostDate": "2012-06-05T14:01:49.18"
        }]
}

... но в IE9 выдает что-то вроде этого:

{
    "UserID": 432,
    "Attachments": {
    "0": {
        "AttachmentID": 2,
        "OwnerID": 321,
        "DisplayName": "sample.pdf",
        "Description": "desc",
        "PostDate": "2012-06-01T09:24:43.817"
    },
    "1": {
        "AttachmentID": 3,
        "OwnerID": 432,
        "DisplayName": "sample3.pdf",
        "Description": "desc",
        "PostDate": "2012-06-05T14:01:00.693"
    },
    "2": {
        "AttachmentID": 4,
        "OwnerID": 543,
        "DisplayName": "sample2.pdf",
        "Description": "desc",
        "PostDate": "2012-06-05T14:01:49.18"
    }
    }
}

Это нарушает мои нокаутирующие привязки, потому что шаблон ожидает, что вложения будут массивом первого порядка.

Интересно, что json2 stringify возвращает первый вывод (чего я и ожидал) в каждом браузере, который я пробовал.

Кто-нибудь видел такое поведение раньше? Любые идеи о том, как это исправить?


person Ross    schedule 05.06.2012    source источник
comment
звучит как ошибка... попробуйте сообщить об этом здесь: - github.com/SteveSanderson/knockout. сопоставление/проблемы   -  person Keith Nicholas    schedule 06.06.2012
comment
Сообщено.   -  person Ross    schedule 06.06.2012


Ответы (1)


Коротко говоря, я не нашел ответа на проблему, но нашел обходной путь. Это некрасиво. Если я переопределю объект JSON и заставлю его использовать JSON3 с помощью delete window.JSON;, то сделаю несколько строковых фокус-покусов, например:

var jsonString = JSON.stringify(objToBind);
var reconstitutedObject = ko.utils.parseJson(jsonString);

... создайте сопоставление из восстановленного объекта и привяжите к воссозданному объекту, дополнительный контейнер, похоже, исчез. Это наводит меня на мысль, что в определении массива, который интерпретируется как контейнер, есть что-то лишнее, но после того, как я поковырялся в внутренностях основного проекта, пронюхав сетевой трафик и попытавшись разобраться в том, как сервер отвечает, я м не хватает.

person Ross    schedule 11.06.2012