Comunidad de diseño web y desarrollo en internet online

problema al recorrer xml

Citar            
MensajeEscrito el 17 Abr 2010 10:15 pm
hola:
tengo declarado unos datos de esta forma:

Código ActionScript :

<mx:Model id="datas">
   <datas>
      <places>
         <name>poruba</name>
         <title>Area Poruba VSB</title>
         <description>soy area poruba</description>
         <lat>49.83150160547969</lat>
         <lng>18.165721893310547</lng>
      </places>
           <places>
         <name>residence</name>
         <title>Area Residence</title>
         <description>Residence studenske koleje</description>
         <lat>49.837125917343045</lat>
         <lng>18.157983720302582</lng>
      </places>
   </datas>
         
</mx:Model>


estoy intentando recorrerlo tal que:

Código ActionScript :

for  (var i:Number=0; i<datas.length; i++)
      {
         var point:LatLng= new LatLng (datas.places[i].lat, datas.places[i].lng);
         var name:String = datas.places[i].name;
         var title:String = datas.places[i].title;
         var description:String= datas.places[i].description;
                        mifuncion(point, name, title, description);
                }


que hago mal??
si le pongo a piñón valor a la i, por ejemplo i=0, me carga perfecto asique tiene que ser problema del for, del datas.length, pero no se que poner si no.

Un saludo

Por yeayu

18 de clabLevel



 

firefox
Citar            
MensajeEscrito el 18 Abr 2010 02:38 am
NO TE ENTENDI NADA GUEON NADA

Por xcom

Claber

530 de clabLevel



 

firefox
Citar            
MensajeEscrito el 18 Abr 2010 06:56 am
creo que está bien explicado...

Por yeayu

18 de clabLevel



 

firefox
Citar            
MensajeEscrito el 18 Abr 2010 05:16 pm
a ver: lo que quiero hacer es hacer un for o un while (me da igual) simplemente para poder sacar todos los places definidos en el <mx:Model>

Por yeayu

18 de clabLevel



 

firefox
Citar            
MensajeEscrito el 19 Abr 2010 07:44 am
¿datas.places.length? (Lo debería comprobar, pero ando un poco "pasota")

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 19 Abr 2010 03:10 pm
con esa condición funciona..pero no perfectamente, ya que me agrega el icono corresponiente a esas latlng(que antes no lo hacia), pero el comportamiento de éste(de uno de ellos)no saca su informacion predeterminada sino, es como si clickearas en el otro..
es un poco dificil de explicar..voy a intentarlo de nuevo:
cargo dos markers, cada marker coge la informacion del <mx:Model> recorriendolo con el for de abajo.
al pulsarle tiene que salir dependiendo del name que le pases una imagen u otra, así como la description y title.
Me carga los iconos y si pulso en uno sale lo que tiene que salir, titulo, foto.. pero si clickeo en el otro, no funciona aparece como si hubiera clickeado en el anterior..

este funciona bien

este con circulo rojo funciona mal


depende de quien declare primero en el <mx:Model>

Código ActionScript :

for (var i:Number=0; i<data.places.length; i++)
      {   
         var point:LatLng= new LatLng (data.places[i].lat, data.places[i].lng);
         var name:String = data.places[i].name;
         var title:String = data.places[i].title;
         var description:String= data.places[i].description;
         var marker:Marker=new Marker(point, new MarkerOptions({icon: new customIcons["camera"]}));
         var options:InfoWindowOptions = new InfoWindowOptions({
           customContent: new MyCustomInfoWindow(point, title, name, description),
            //tamaño del infowindow los bordes
            width: 200,
             height: 180,
             drawDefaultFrame: true,
             hasShadow: false
            });
            marker.addEventListener(MapMouseEvent.CLICK, function(e:Event):void {
                marker.openInfoWindow(options); 
            });
            this.map.addOverlay(marker);
        }


que hace myCustomInfoWindow?:

Código ActionScript :

package
{

import com.google.maps.LatLng;

import mx.containers.Canvas;
import mx.controls.Image;
import mx.controls.Label;
import mx.controls.TextArea;
import mx.core.UIComponent;

public class MyCustomInfoWindow extends UIComponent {

    public function MyCustomInfoWindow(latlng:LatLng, title:String, name:String, description:String) {
       //Set up a canvas to fit inside the infowindow
        var can:Canvas = new Canvas();
         can.width = 180;
         can.height = 180;


         //Set up a label for the heading of the marker's infowindow
         var heading:Label = new Label();
         heading.x = 5;
         heading.y = 5;
         heading.width = 120;
         heading.height = 15;
         heading.text = title;

         //Set up a text area for the description of the marker's infowindow
         var desc:TextArea = new TextArea();
         desc.editable = false;
         desc.selectable = false;
         desc.x = 5;
         desc.y = 125;
         desc.width = 120;
         desc.height = 15;
         desc.htmlText = description;
         desc.setStyle("borderStyle", "none");
         var image:Image = new Image();
         //depende del name, carga una imagen u la otra       
        switch (name)
          {
             case("poruba"):
             image.source = "http://sites.google.com/site/yeayu1987/Poruba.jpg";
             break;
             
             case("residence"):
             image.source = "http://sites.google.com/site/yeayu1987/source.JPG";
             break;
          }
        image.width = 150;
         image.height = 150;
         image.x = 5;
         image.y = 30;
         image.visible = true;

         //Add all of the components to the canvas
         can.addChild(heading);
         can.addChild(image);
         can.addChild(desc);
           addChild(can);
    }
}
}



Perdon por el tostón que os acabo de meter.. pero no tengo a mucha gente a quien preguntar...

Por yeayu

18 de clabLevel



 

firefox
Citar            
MensajeEscrito el 19 Abr 2010 04:56 pm
Creo que el problema está cuando declaras el listener

Código ActionScript :

marker.addEventListener(MapMouseEvent.CLICK, function(e:Event):void { 
         marker.openInfoWindow(options);  
         }
); 

Sé que hay autores que usan esas "funciones temporales" (ahora no me acuerdo su nombre técnico). Personalmente no me gustan. Así que yo pensaría en escribir algo como

Código ActionScript :

marker.addEventListener(MapMouseEvent.CLICK,mostrarInfo)
function mostrarInfo(e:MapMouseEvent){
      var marca:Marker=e.currentTarget as Market
}


Vale, ahora tengo el problema que sólo tengo las "propiedades" de la "marca" seleccionada ¿Podemos en base a propiedades de ese Objeto hallar el resto de datos que necesitamos para ejecutar el ¿marker.openInfoWindow(options);?

Un método "ineficaz" que nos puede servir si no tenemos demasiados puntos es recorrernos otra vez el XML y comprobar la latitud y longitud, en momento que encontremos el punto tendremos en ese "i" los valores necesarios para generar nuestro "options".

Código ActionScript :

function mostrarInfo(e:MapMouseEvent){
      var marca:Marker=e.currentTarget as Market
      var langlat=marca.getLatLng() 
      for (var i:Number=0; i<data.places.length; i++) 
      {    
         var point:LatLng= new LatLng (data.places[i].lat, data.places[i].lng); 
         if (point.equals(langlat)){
                  //<---aquí tenemos nuestro "dato"---------->
           var name:String = data.places[i].name; 
           var title:String = data.places[i].title; 
           var description:String= data.places[i].description;
           var options:InfoWindowOptions = new InfoWindowOptions({ 
           customContent: new MyCustomInfoWindow(point, title, name, description), 
            //tamaño del infowindow los bordes 
            width: 200, 
             height: 180, 
             drawDefaultFrame: true, 
             hasShadow: false 
            }); 
            marca.openInfoWindow(options);  
            break;
         }
      }
}


El otro modo sería extender la Clase Market con todas las propiedades necesarias para generarla

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 19 Abr 2010 05:32 pm
lo he probado y va de maravilla, llevaba todo el dia mirando el foro!! aunque no he entendido muy bien eso de las funciones temporales..
al final el código queda así:

Código ActionScript :

for (var i:Number=0; i<data.places.length; i++)
      {   
         var point:LatLng= new LatLng (data.places[i].lat, data.places[i].lng);
         var marker:Marker=new Marker(point, new MarkerOptions({icon: new customIcons["camera"]}));
         marker.addEventListener(MapMouseEvent.CLICK,mostrarInfo);
         this.map.addOverlay(marker);
        
       }

de aquí llama a la funcion "mostrarInfo" que has posteado antes.

Muchas Gracias Eliseo!

Por yeayu

18 de clabLevel



 

firefox
Citar            
MensajeEscrito el 20 Abr 2010 06:29 am
Sólo como dato. El problema forma parte de algo más amplio que es pasar parámetros a un Evento. (Realmente se llaman funciones anónimas -no temporales. Aunque, en tu caso, ni tan siquiera era una función anónima). Una función anónima es cuando, en un listener añadimos la función

Código ActionScript :

addEventListener(MouseEvent.CLICK,
              function(evt:MouseEvent){....haz algo...},
              false, 0, true);

El problema básico de estas funciones es que son imposibles de "limpiar de la memoria" (además de que no sean elegantes y bla-bla-bla)

Por Eliseo2

710 de clabLevel



 

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.