Toon posts:

[js+google+callback] referentie naar object kwijt

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben een jQuery 'plugin' aan het schrijven voor Google Maps.
Er zijn er al idd redelijk wat voor, maar ik wil graag dit zelf schrijven, zodat het precies kan wat ik wil.
Maar dat terzijde.

Eerst even de code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
(function($) { 
    $.extend({ 
        jGMap: function(options)
        {
            var defaults = {
                origin: null
            ,   instance: $('#map') // Even snel op deze manier
            }
            
            defaults = $.extend(defaults, options);
            
            this.geoder = false;
        }       
    }),
    
    $.extend($.jGMap.prototype, {   
        findAddress: function(address){
            if (!this.geocoder)
            {
                this.geocoder = new GClientGeocoder();
            }
            
            var map = this;
            
            this.geocoder.getLatLng(
                address,
                function(point){
                    map.options.origin = point;
                }
            );
            
            return this;
        },
        
        visualizeRange: function(){
            alert(this.options.origin); // en nu is dit dus nog gewoon null, logisch
        }
    });
})(jQuery);


Het gaat eigenlijk om dit stukje
code:
1
2
3
4
5
6
7
8
9
10
            var map = this;
            
            this.geocoder.getLatLng(
                address,
                function(point){
                    map.options.origin = point;
                }
            );
            
            return this;


Ik zou graag willen weten hoe ik op kan lossen dat het verkregen punt (point) daadwerkelijk in het object wordt vastgelegd binnen de options en niet in de kopie van dat object.
Als nu this.visualizeRange zou worden aangeroepen zou het resultaat null zijn.

Beetje kort door de bocht en onduidelijk: maar ik heb het zo ver mogelijk gestript.

Ik heb begrepen dat dit met de functionaliteit van bind zou moeten kunnen.
Ik begrijp echter niet hoe en wat ik moet binden in dit geval.

Heb wel de voorbeelden bekeken, maar ik begrijp niet hoe ik de getLatLng / geoCoder van Google zou moeten binden.

Iemand enig idee?
Hoop dat iemand de vraagstelling een beetje snapt of dit wel eens is tegengekomen en me kan helpen.

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Je jGMap instance heeft helemaal geen options property voor zover ik kan zien. Moet je in je constructor niet dit doen:
JavaScript:
1
this.options = $.extend(defaults, options);

?

Met de verwijzing naar je instance is niets mis, da's een nette closure.

[ Voor 17% gewijzigd door crisp op 22-12-2008 23:50 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Oh sorry klopt, die stond er origineel ook :)

Maar de waarde van point wordt niet in this.options.point vastgelegd, hij blijft null.

Hij wordt dus zo aangeroepen:

var test = new $.jGMap(); // eventueel options meegeven
$(test).findAddress('blaaaaat').visualizeRange();

(dit zal nu even niet helemaal correct zijn, maar gaat om de strekking)

findAdress werkt gewoon goed, maar visualizeRange geeft dus de melding "null".

[ Voor 52% gewijzigd door Verwijderd op 23-12-2008 00:01 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Is getLatLng() niet toevallig een method die een asynchroon request doet?

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
This method takes as parameters a string address to convert, and a callback function to execute upon retrieval of the address. The callback function is necessary since geocoding involves sending a request to Google's servers and can take some time.
Niemand een idee of is hier tegen aan gelopen?

[ Voor 8% gewijzigd door Verwijderd op 23-12-2008 20:04 ]


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Is toch duidelijk :? je moet een callback functie meegeven die wordt gefired wanneer de asynchrone request klaar is.

Verwijderd

Topicstarter
Is zeker duidelijk en die callback function is er ook zoals je ziet.
Als je de hele vraag leest, zie je dat dat niet het probleem is.
Gaat erom dat ik de referentie naar het object kwijt ben en daar niets in kan vastleggen vanuit die callback function.

  • UltimateB
  • Registratie: April 2003
  • Niet online

UltimateB

Pomdiedom

Even uit mijn hoofd, geloof dat het als volgt werkt.

code:
1
2
3
4
5
6
7
8
9
10
11
var map = this;
            
this.geocoder.getLatLng(
  address,
  GEvent.callback(this, 
    function(point){
      this.options.origin = point;
    })
  );

return this;


Op deze manier zou de functie binnen de juiste scope , geloof ik :P

Handiger geweest als je een linkje had naar je kaartje.

"True skill is when luck becomes a habit"
SWIS


  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

Verwijderd schreef op maandag 22 december 2008 @ 23:57:
Hij wordt dus zo aangeroepen:

var test = new $.jGMap(); // eventueel options meegeven
$(test).findAddress('blaaaaat').visualizeRange();
Maar nu wordt visualizeRange() toch al aangeroepen vóórdat findAddress() daadwerkelijk resultaten heeft opgelevert? findAddress wordt uitgevoerd, halverwege start dat een asynchroon stukje en direct erna probeer je visualizeRange() uit te voeren, terwijl dat asynchrone stukje waarschijnlijk nog volop bezig is om met Google te communiceren.

Je zult de callback functie niet alleen moeten gebruiken om de waarde in te stellen, maar ook om daadwerkelijk door te gaan met de executie van je script, en die moet dus uiteindelijk ook zorgen voor de visualizeRange() aanroep. Of je moet je oorspronkelijke stukje code expliciet laten wachten tot die waarde gevuld is :)

Verwijderd

Topicstarter
Bedankt voor de informatie, daar kan ik weer mee aan de slag.
De aanroep was slechts een voorbeeld.
VisualizeRange wordt in het volledige script aangeroepen door de callbackfunction.
Pagina: 1