1

これはおそらく非常に単純ですが、私の人生では、これが正しくバインドされない理由がわかりません。

私の主な見解では:

initMap: function() {
    forge.logging.log('... Initializing map');
    var createMap = function(position) {
        var latLng = new google.maps.LatLng(position.coords.latitude, position.coords.longitude, true);
        var options = {
            zoom: 15,
            center: latLng,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        };
        this.map = new google.maps.Map(document.getElementById('map_canvas'), options);
        this.addMarkers();
    };
    _.bind(createMap, this);
    forge.geolocation.getCurrentPosition(createMap);
    forge.logging.log('Created map ...');
},
addMarkers: function() {
    alert('addMarkers');
    forge.logging.log('... Adding markers');
    var tempData = ["xxxxxxxx",
                    "xxxxxxx",
                    "xxxxxxxx"];

    _.each(tempData, function(addr){
        google.maps.Geocoder.geocode({'address': addr}, function(res, status){
            if (status == google.maps.GeocoderStatus.OK) {
                new google.maps.Marker({
                    map: this.map,
                    position: res[0].geometry.location
                });
            }
        });
    });

    forge.logging.log('Added markers ...');
}

何らかの理由で、 this.addMarkers() が呼び出されていないようです。これは正しくバインドされていないためだと思います。ただし、マップは完全に正常に表示されます。

これを createMap コールバック関数にバインドするにはどうすればよいですか?

4

1 に答える 1

4

細かいマニュアルから:

練る _.bind(function, object, [*arguments])

関数objectにバインドします。つまり、関数が呼び出されるたびに、thisの値がobjectになります。必要に応じて、引数関数にバインドして事前入力します (部分適用とも呼ばれます) 。

var func = function(greeting){ return greeting + ': ' + this.name };
func = _.bind(func, {name : 'moe'}, 'hi');
func();
=> 'hi: moe'

ドキュメントはもう少し明示的かもしれませんが、重要な部分は例にあります:

func = _.bind(func, ...)

したがって_.bind、バインドされた関数を返します。関数をその場で変更しません。あなたはこう言いたい:

createMap = _.bind(createMap, this);

または多分これ:

var createMap = function(position) { ... };
forge.geolocation.getCurrentPosition(_.bind(this, createMap));

_.bindAll他の場所で使用して混乱している可能性があります。_.bindAll関数はインプレースで関数を変更しているように見えますが、実際にはインプレースを変更しているため、次のようにobjectなります。

_.bindAll(obj, 'm1', 'm2');

多かれ少なかれ、これを内部的に行っています:

obj.m1 = _.bind(obj, obj.m1);
obj.m2 = _.bind(obj, obj.m2);
于 2012-08-30T23:24:05.063 に答える