在Backbone.js中将回调绑定到此

Binding a callback to this in Backbone.js

本文关键字:绑定 回调 Backbone js      更新时间:2023-09-26

这可能很简单,但就我的生活而言,我不明白为什么这没有正确绑定。

在我的主要观点中:

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回调函数?

来自精细手册:

绑定_.bind(function, object, [*arguments])

函数绑定到对象,这意味着无论何时调用该函数,this的值都将是目标。或者,将参数绑定到函数以预填充它们,也称为部分应用程序

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);