2010-11-01 5 views
1

J'essaie d'utiliser la bibliothèque JavaScript OpenLayers pour charger un certain nombre de fichiers KML à une carte. Je peux charger tout le KML sans problème, mais maintenant, en essayant de récupérer les données de l'objet OpenLayers.Layer.Vector en cours de génération, je suis confronté à un problème.Console JavaScript peut voir le contenu de l'objet, mais je ne peux pas y accéder

Si je génère l'objet généré avec console.log, je peux voir l'objet complet avec toutes ses propriétés, mais si j'essaie d'accéder à la plupart des propriétés par programme, j'obtiens une erreur indéfinie. Voici mon code:

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... 

Donc avec juste console.log (couche) je suis capable de tout voir. Avec la ligne suivante, cependant, bien que l'information existe clairement, j'obtiens l'erreur. De plus, lorsque j'essaie d'accéder directement à la même information via la console, cela fonctionne très bien.

Est-ce que je manque quelque chose d'évident ici?

EDIT:

Voici l'objet racine

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:

Ce ne sera pas en mesure de stringify facilement alors voici quelques informations pertinentes:

intérieur " caractéristiques ":

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

intérieur "0":

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

intérieur "attributs":

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

Pour clarifier les "layer.features [0] .attributes.name" que je tente d'utiliser dans mon code fonctionne parfaitement bien quand je le tape dans la console.

EDIT 3!

de sortie de tiers un accès direct via la console:

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 

Sortie d'un script hardcoded:

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

** Que ** obtenez-vous lorsque vous affichez 'console.log (couche) '? La réponse à cette question dépend clairement de la structure de l'objet 'layer'. Par exemple, vous supposez que l'objet 'layer' résultant a une propriété appelée' features', mais il n'y en a pas ici: http://dev.openlayers.org/releases/OpenLayers-2.10/doc/apidocs/files/OpenLayers /Layer-js.html –

+0

Pouvez-vous poster console.log()? Peut-être JSON stringifié si votre navigateur ne le sort pas déjà comme ça. –

+1

Nous avons également besoin de voir la structure de layer.features. – Stephen

Répondre

1

Vous devriez être en mesure de voir les propriétés à condition que vous suivez la chemin vers eux correctement. Votre expression complète est layer.features[0].attributes.name. Ce que vous avez dit au courant si nous bien que les parties layer.features et layer.features[0] ont raison, mais nous aurions dû savoir ce qui est en layer.features[0] de savoir si elle a une propriété attributes, etc.

Une chose qui saute aux yeux est que attributes est au pluriel et vous accédez directement à une propriété. Le pluriel suggère il peut être un tableau, et peut-être vous avez besoin de regarder un indice?

Pour ce genre de choses, je trouve que rien ne vaut un débogueur.Vous pouvez utiliser un zoom avant dans l'objet layer pour savoir exactement ce qu'il y a dedans, et généralement, quand vous faites cela, vous voyez même le chemin vers le point auquel vous vous êtes étendu. Il y a débogueurs pour tous les principaux navigateurs là-bas:

  • Chrome et Safari ont "Dev Tools" intégré (sur Chrome Ctrl + Maj + I ouvre le panneau)
  • Firefox a l'excellent Firebug add-in
  • IE a la version gratuite de Visual Studio.Net (et IE8 et surtout avoir des outils intégrés ainsi)

Modifier: Cette partie de votre question est intéressante mise à jour:

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

Cela suggère que, soit A) features est un tableau vide, ou B) features est une matrice clairsemée qui n'a pas un indice 0. Tous les tableaux JavaScript sont rares (ils ne sont pas des tableaux vraiment du tout), donc vous pouvez essayer:

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

Oui, la solution est littéralement à portée de clic dans Chrome Developer Tools. Ou deux, pour élargir le tableau des fonctionnalités. –

+0

En utilisant les outils de développement Chrome, c'est pourquoi je sais que l'information est là en premier lieu. Comme mentionné dans la console, je peux accéder à ces données, mais en faisant la même chose dans mon code, il est cassé. – Jared

+1

J'ai un problème similaire, quand je donne console.log (layer.features.length) il montre 0, mais quand je donne même dans la console firebug alors la longueur est montrée comme 10 (qui est le tableau de fonctionnalités de longueur réelle, je suis capable de voir dans firebug) .Quelle pourrait être la raison? Avant de créer l'objet 'layer', layer.features.length appelle? –

0

Vous aurez besoin d'étudier le format de votre objet. Ceci est le long chemin autour, mais essayez ceci:

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

Quelque part sur la ligne que vous obtiendrez une erreur, et qui vous dira où votre problème. Je devine, après avoir vu votre journal actuel, que attributes ou name n'existe pas (du moins pas dans le format que vous pensez qu'ils font). (bien sûr, il est préférable/plus facile d'utiliser le drill-down dans firebug pour cela, mais l'extrait ci-dessus vous permettra de démarrer.)

Questions connexes