2012-06-16 24 views
0

我在後面的骨幹視圖中遇到了一個問題,呈現谷歌街景。街景和骨幹變量範圍

問題是,在processSVData函數中,this不是App.DetailStreetView的實例。當我console.log(this)裏面processSVData(),我得到DOMWindow對象。因此,試圖訪問this.panorama當我undefined

App.DetailStreetView = Backbone.View.extend({ 
    initialize: function() { 
     this.latLng = new google.maps.LatLng(37.869085,-122.254775); 
     this.panorama = new google.maps.StreetViewPanorama(this.el); 
    }, 
    render: function() { 
     var sv = new google.maps.StreetViewService(); 
     sv.getPanoramaByLocation(this.latLng, 50, this.processSVData);   
    }, 
    processSVData: function(data, status) { 
     if (status == google.maps.StreetViewStatus.OK) { 
      // calculate correct heading for POV 
      //var heading = google.maps.geometry.spherical.computeHeading(data.location.latLng, this.latLng); 
      this.panorama.setPano(data.location.pano); 
      this.panorama.setPov({ 
       heading: 270, 
       pitch:0, 
       zoom:1, 
      }); 
      this.panorama.setVisible(true); 
     } 
    }, 
}); 

回答

1

您有幾種選擇。你可以使用_.bindAll綁定processSVData到相應的this

initialize: function() { 
    _.bindAll(this, 'processSVData'); 
    //... 
} 

這將使this始終內部processSVData的看法。

您也可以使用_.bind只是回調:

sv.getPanoramaByLocation(this.latLng, 50, _.bind(this.processSVData, this)); 

這將確保this是當this.processSVData被稱爲一個sv.getPanoramzByLocation回調的觀點。您可以使用$.proxyFunction.bind(如果您不必擔心瀏覽器版本問題)做類似的事情。

或者你可以用手在平時的jQuery的風格做到這一點:

var _this = this; 
sv.getPanoramaByLocation(this.latLng, 50, function(data, status) { 
    _this.processSVData(data, status); 
}); 

第一,_.bindAll,很可能是在骨幹網中最常用的方法。

+0

最好的解決方案,因爲你已經在頁面上有下劃線。儘可能使用本地綁定。 – adrian

+0

@ amchang87:下劃線的'_.bindAll'建立在'_.bind'上,並且AFAIK,'_.bind'使用本地的'Function.bind'(如果可用)。 –