2012-05-04 4 views
1

С плагином для отображения nockoutjs 2.11 я обнаружил, что ko.mapping.toJS генерирует пустые элементы массива, если viewmodel (с элементом массива) обновляется с помощью ko.mapping.fromJS, а длина нового элемента массива длиннее старого один.нокаут отображение toJS ошибка? пустые элементы массива

Мои исходные данные отображенных является:

var initData = {text: 'Some Text', 
       arr: [{key: 1, value: 'a'}, 
         {key: 2, value: 'b'}]}; 

Тогда я обновил вид модели с новым объектом:

var newData = {text: 'Changed Text', 
       arr: [{key: 1, value: 'aa'}, 
         {key: 12, value: 'bb'}, 
         {key: 13, value: 'cc'}]}; 

После того, что я назвал ko.mapping.toJS(), я обнаружил, что 3-й элемент массива - пустой объект. Я не уверен, что это ошибка, или я что-то пропустил. Еще одна вещь, которую я заметил, это происходит только в первый раз, когда я обновляю данные. Если я обновляю модель представления с помощью initData, тогда newData снова, результат будет правильным. http://jsfiddle.net/gonglei/xgPSq/

Редактировать: Спасибо за ваш ответ Джейсон. Ваше решение, похоже, не соответствует моей ситуации в моем реальном проекте. Мне нужно получить модифицированный объект данных и отправить его на сервер. Поэтому, когда я вызываю ko.mapping.toJS, я надеюсь, что сразу смогу получить правильный объект данных, а не просто показать строку JSON в вычисленной функции. Я поставил точку прерывания сразу после вызова ko.mapping.toJS и посмотрел объект данных, а третий элемент действительно пуст. И мой сервер получил этот пустой элемент. Расширитель дроссельной заслонки сделал мне правильный объект, но он асинхронный. В любом случае я сообщил об этом как об ошибке, посмотрим, сможет ли разработчик подтвердить это или дать мне решение.

+0

Лучший, вероятно, чтобы сообщить об этой ошибке в протокол HTTPS : //github.com/SteveSanderson/knockout.mapping – Niko

+0

Объект данных верен немедленно, и ko.mapping.toJS возвращает правильный JSON, я думаю, единственная проблема - это ko.mapping.toJS, не вызывающая вызывать изменение gui. –

+0

У меня также возникла проблема в IE 9, где отображение Knockout заполняет пустые элементы в коллекции. Иногда эта ошибка возникает, что затрудняет диагностику. У меня был массив из 4 элементов JSON, который заполнял только первый и последний элементы ([[object Object] ,,, [object Object]]). Странно, да? –

ответ

0

Третий элемент не пустой объект. Вы можете увидеть ваш список связывания, что он имеет значение, и даже если вы поместите это в конце вашего изменения функции(), он возвращает правильный JSON:

alert('JSON is ' + ko.mapping.toJSON(self.data)); 

Может быть ko.mapping.toJSON() Безразлично 't регистрировать себя как зависящее должным образом или оно требует некоторых ярлыков и не предназначено для использования в вычисленном?

Редактировать

Использование дроссельной заслонки расширитель, чтобы заставить электронн произойти после того, как все изменения сделаны решает проблему (jsfiddle)

this.json = ko.computed(function() { 
     return JSON.stringify(ko.mapping.toJS(self.data, mapping)); 
    }).extend({ throttle: 1 }); 
+0

Спасибо за ваш ответ Джейсон. Хотя ваше решение, похоже, не соответствует моей ситуации в моем реальном проекте. См. Мой отредактированный вопрос. – lei

+0

Странно, когда я поставил предупреждение в своем ответе НЕМЕДЛЕННО после изменения, я получаю правильный JSON. Единственная проблема, которую я обнаружил, заключалась в том, что вычисление не срабатывало сразу, заставляя html обновляться, toJSON [always] (http://jsfiddle.net/EDt6f/) вернул правильный ответ. –