2012-08-30 51 views
1

這可能很簡單,但對於我的生活,我無法弄清楚爲什麼這不是正確綁定。在Backbone.js中綁定一個回調

在我的主要觀點:

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回調函數?

+0

確定這在initMap本身中是正確的嗎?一般來說,我建議在iWebInspector(http://www.iwebinspector.com/)或Chrome之類的東西上進行調試,這樣你就可以正確地檢查這個... –

+0

是的,只是檢查。這在initMap中是正確的,但是當createMap被調用時,它被設置爲窗口對象。 – James

+0

如果您將所有僞造*調用並以直接的靜態Web應用程序(使用navigator.geolocation而不是forge.geolocation)運行代碼,它是否按預期工作? –

回答

4

fine manual

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

綁定一個功能對象,這意味着無論何時調用該函數時,的的值將是對象。可選地,將參數綁定到函數以預先填充它們,也稱爲部分應用

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