2012-06-05 2 views
0

Немного тайны возникло с использованием нокаута (2.1.0) и отображения нокаута (2.1.2) в IE9. По какой-то причине индексы массивов объектов превращаются в родительские объекты. Например:knockout.mapping, 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 возвращает первый результат (что я и ожидал) в каждом браузере, который я пробовал.

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

+0

звучит как ошибка .... попробуйте сообщить об этом здесь: - https://github.com/SteveSanderson/knockout.mapping/issues –

+0

[Сообщено] (https://github.com/SteveSanderson/knockout.mapping/вопросы/81). – Ross

ответ

0

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

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

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