2010-11-01 3 views
1

Я пытаюсь использовать библиотеку JavaScript OpenLayers для загрузки нескольких файлов KML на карту. Я могу загрузить весь KML без проблем, но теперь, пытаясь извлечь данные из созданного объекта OpenLayers.Layer.Vector, я столкнулся с проблемой.Консоль JavaScript может видеть содержимое объекта, но я не могу получить к нему доступ

Если я выдаю сгенерированный объект с помощью console.log, я могу увидеть полный объект со всеми его свойствами, но если я попытаюсь получить доступ к большинству свойств программно, я получаю неопределенную ошибку. Вот мой код:

map = new OpenLayers.Map("mapdiv"); 
    map.addLayer(new OpenLayers.Layer.OSM()); 

    var vectors = new Array(); 

    for(i = 1; i <= 14; i++) { 

     var layer = new OpenLayers.Layer.Vector("KML", { 
      strategies: [new OpenLayers.Strategy.Fixed()], 
      protocol: new OpenLayers.Protocol.HTTP({ 
       url: "kml/" + i + ".kml", 
       format: new OpenLayers.Format.KML 
      }) 
     }); 
     console.log(layer); 
     console.log(layer.features[0].attributes.name); 

     vectors.push(layer); 
    } 
    //etc... 

Так что с помощью console.log (layer) я могу видеть все. Однако со следующей строкой, хотя информация явно существует, я получаю сообщение об ошибке. Кроме того, когда я пытаюсь получить доступ к одной и той же информации непосредственно через консоль, она работает нормально.

Я пропустил что-то очевидное здесь?

EDIT:

Вот корневой объект

Object: 
EVENT_TYPES: Array[25] 
alwaysInRange: true 
div: HTMLDivElement 
drawn: true 
events: Object 
features: Array[1] 
id: "OpenLayers.Layer.Vector_39" 
inRange: true 
map: Object 
maxExtent: Object 
maxResolution: 1.40625 
maxScale: 13517.573318481445 
minExtent: null 
minResolution: 0.00004291534423828125 
minScale: 442943842.5 
name: "KML" 
numZoomLevels: 16 
options: Object 
projection: Object 
protocol: Object 
renderer: Object 
resolutions: Array[16] 
scales: Array[16] 
selectedFeatures: Array[0] 
strategies: Array[1] 
styleMap: Object 
tileSize: Object 
units: "degrees" 
unrenderedFeatures: Object 
__proto__: Object 

EDIT 2:

не будет иметь возможность легко Stringify так вот некоторая соответствующая информация:

внутри " функции ":

0: Object 
length: 1 
__proto__: Array[0] 
id: "OpenLayers.Layer.Vector_39" 

внутри "0":

attributes: Object 
data: Object 
geometry: Object 
id: "OpenLayers.Feature.Vector_3508" 
layer: Object 
lonlat: null 
renderIntent: "default" 
state: null 
style: null 
inRange: true 

внутри "атрибуты":

name: <string, which I can assure you exists> 

Для пояснения в "layer.features [0] .attributes.name", что я пытаюсь использовать в своем коде отлично работает, когда я ввожу его в консоль.

EDIT 3!

ярусах выхода из прямого доступа через консоль:

1) layer -> Object 
2) layer.features -> Object 
3) layer.features[0] -> Object 
4) layer.features[0].attributes -> Object 
5) layer.features[0].attributes.name -> <the string I'm looking for> 
OR 
6) layer.features[0].attributes['name'] works the same as above 

Выход из закодированного сценария:

1) layer -> Object 
2) layer.features -> [] 
3) layer.features[0] -> undefined 
etc... 
+1

** Что вы получаете, когда вы показываете 'console.log (layer) '? Ответ на этот вопрос явно зависит от структуры объекта 'layer'. Например, вы предполагаете, что результирующий объект 'layer' имеет свойство, называемое' features', но нет ни одного перечисленного здесь: http://dev.openlayers.org/releases/OpenLayers-2.10/doc/apidocs/files/OpenLayers /Layer-js.html –

+0

Можете ли вы разместить console.log()? Возможно, JSON сжал, если ваш браузер не выводит его так уже. – 2010-11-01 19:13:33

+1

Нам также необходимо увидеть структуру layer.features. – Stephen

ответ

1

Вы должны быть в состоянии увидеть свойства при условии вы следуете путь к ним правильно. Ваше полное выражение: layer.features[0].attributes.name. То, что ты писал до сих пор говорит нам, что layer.features и layer.features[0] части правы, но мы должны знать, что в layer.features[0] знать, имеет ли он в attributes собственности и т.д.

Одна вещь, которая выскакивает в том, что attributes - это множественное число, после чего вы напрямую получаете доступ к собственности. Множество предлагает это может быть массив, и поэтому, возможно, вам нужно посмотреть на индекс?

Для этого материала я не нахожу ничего избивающего отладчика.Вы можете использовать одну развертку в объекте layer и выяснить, что там находится, и обычно, когда вы делаете это, вы даже видите путь к точке, к которой вы расширили. Есть отладчики для каждого крупного браузера там:

  • Chrome и Safari имеют «Dev Tools», встроенную в (на Chrome Ctrl + Shift + I откроет панель)
  • Firefox имеет отличную Firebug надстройка
  • IE имеет бесплатную версию Visual Studio.Net (и IE8 и выше, имеет некоторые встроенные инструменты, а)

Редактировать: Эта часть обновленного вопроса интересна:

2) layer.features -> []
3) layer.features[0] -> undefined

Это говорит о том, что либо А) features является пустым массивом, или Б) features является редкой массива, который не имеет индекса 0. Все массивы JavaScript немногочисленны (они на самом деле не массивы вообще), так что вы можете попробовать:

var name; 
for (name in layer.features) { 
    console.log(name + ": " + layer.features[name]); 
} 
+0

Да, это решение буквально в один клик в Chrome Developer Tools. Или два, чтобы расширить массив признаков. – 2010-11-01 19:23:19

+0

Использование инструментов Chrome dev, поэтому я знаю, что информация там в первую очередь. Как упоминалось в консоли, я могу получить доступ к этим данным, но делать то же самое в моем коде, это сломано. – Jared

+1

У меня такая же проблема, когда я даю console.log (layer.features.length), показывая 0, но когда я даю то же самое в консоли firebug, тогда длина отображается как 10 (это массив фактических длин, I я могу видеть в firebug). Какая может быть причина? перед созданием объекта «layer» - layer.features.length вызывает? –

0

Вы должны изучить формат объекта. Это долгий путь вокруг, но попробуйте это:

console.log(layer.features); 
console.log(layer.features[0]); 
console.log(layer.features[0].attributes); 
console.log(layer.features[0].attributes.name); 

Где-то вниз по линии, вы получите сообщение об ошибке, и это покажет вам, где ваша проблема. Я бы предположил, увидев ваш текущий журнал, что либо attributes, либо name не существует (по крайней мере, не в том формате, который, по их мнению, они делают). (конечно, для этого лучше/проще использовать древовидную структуру в firebug, но приведенный выше фрагмент поможет вам начать.)

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

  • Нет связанных вопросов^_^