2015-01-28 5 views
0

Я изо всех сил пытаюсь преобразовать строку JSON в наблюдаемый массив для использования в цикле foreach в HTML. Я получаю дополнительное неопределенное свойство в наблюдаемом массиве, когда я его просматриваю. Любая помощь будет значительно оценена. Вот мой код:undefined (extra) object in knockoutjs observableArray, созданный из строки JSON

var regions = '{"1":{"id":1,"name":"Scotland"},"3":{"id":3,"name":"North West"},"7":{"id":7,"name":"South East"},"5":{"id":5,"name":"East Anglia"},"9":{"id":9,"name":"Wales"},"8":{"id":8,"name":"South West"},"6":{"id":6,"name":"Greater London"},"2":{"id":2,"name":"North East"},"4":{"id":4,"name":"Midlands"}}'; 

this.regions = ko.observableArray(); 
ko.mapping.fromJSON(regions, {}, this.regions()); 

ko.utils.arrayForEach(this.regions(), function(region){ 
       console.log(region); 
      }); 

Когда я запускаю мой forloop - я получаю 10 журналов консоли, когда есть только 9 объектов в строке JSON, первый журнал не определен, а следующий 9 является правильным.

undefined 
store-locator.html:174 Object {id: function, name: function} 
store-locator.html:174 Object {id: function, name: function} 
store-locator.html:174 Object {id: function, name: function} 
store-locator.html:174 Object {id: function, name: function} 
store-locator.html:174 Object {id: function, name: function} 
store-locator.html:174 Object {id: function, name: function} 
store-locator.html:174 Object {id: function, name: function} 
store-locator.html:174 Object {id: function, name: function} 
store-locator.html:174 Object {id: function, name: function} 

Я могу перебрать массив в HTML с помощью следующего кода, но опять же я получаю пустой элемент списка в начале моего списка следует 9 имен областей.

<ul data-bind="foreach: $root.regions()"> 
    <li data-bind="text: name"></li> 
</ul> 

P.S Я довольно уверен, что JSON действительно, это PHP массив, преобразованный с использованием json_encode()

+2

Вы 'regoins' не содержат ** массив **, но объект, который имеет proeprties, который называется 1,2,3,4 и т. Д., Это не поддерживается плагином сопоставления, поэтому он не может правильно создать массив для вы. Если вы измените свои «регионы», чтобы содержать реальный массив, он работает нормально: http://jsfiddle.net/gpm2zuvs/ – nemesv

+1

Если вы не можете изменить то, что получаете с серверной стороны, я предлагаю вам использовать ko.utils.parseJson вместо этого выполнить эту задачу. Проверьте вывод консоли на скрипку http://jsfiddle.net/f1dbLq3j/11/. Проверьте консольный выход скрипки – Sabry

ответ

0

Ого, это намного проще сделать в Угловом. Спасибо за ваши комментарии, и полезные ответы, но memesv 'ответ был тем, что мне действительно нужно было знать.

Изменен бэкэнд в конце, чтобы обеспечить массив без ключей, чтобы нокаут смог правильно интерпретировать их данные.

Большое спасибо. Ash

Смежные вопросы