2015-06-18 17 views
9

Birden fazla WMS sunucusuna bağlanabilmeli, WMS Yeteneklerini sormalı ve sunucular tarafından bildirilen katmanları gösterebilmelidir OpenLayers3'ün üzerine kurulu bir web haritası istemcisini uygulıyorum.Her işlevde nasıl bağlanır (bu)?

var MyMapClient = function(params) { 
    this.wms_sources_ = params.wms_sources; 
    this.wms_capabilities_ = []; 
} 

MyMapClient.prototype.parse_capabilities = function(index) { 
    var capabilities = this.wms_capabilities_[index]; 
    // do something with capabilities 
} 

MyMapClient.prototype.load_wms_capabilities = function() { 
    var parser = new ol.format.WMSCapabilities(); 

    jQuery.each(this.wms_sources_, (function (index, wms_source) { 

     console.log("Parsing " + wms_source.capabilities_url); 

     jQuery.when(jQuery.ajax({ 
      url: wms_source.capabilities_url, 
      type: "GET", 
      crossDomain: true, 
     })).then((function (response, status, jqXHR) { 
      var result = parser.read(response); 
      console.log("Parsed Capabilities, version " + result.version); 
      this.wms_capabilities_[index] = result; 
      return index; 
     }).bind(this)).then(this.parse_capabilities.bind(this)); 

    }).bind(this)); 
}; 

Yukarıdaki kod çalışıyor ama bind(this) I MyMapClient 'ın örneğinin "özel" değişkenlerine erişim gerektiren bir işlevi çağırmak istediğiniz her zaman var. Okunabilirlikten ödün vermeden, örnek içeriğe sürekli olarak erişmenin daha iyi bir yolu yok mu?

cevap

7

Ben iki dünyanın en iyisini kullanmak söyleyebilirim, yani gerekli bind() yerel bir doğru kapsamını tutan değişken ve çağrılar:

MyMapClient.prototype.load_wms_capabilities = function() { 
    var parser = new ol.format.WMSCapabilities(), 
     _this = this; 

    jQuery.each(this.wms_sources_, function (index, wms_source) { 
     console.log("Parsing " + wms_source.capabilities_url); 

     jQuery.when(jQuery.ajax({ 
      url: wms_source.capabilities_url, 
      type: "GET", 
      crossDomain: true, 
     })).then(function (response, status, jqXHR) { 
      var result = parser.read(response); 
      console.log("Parsed Capabilities, version " + result.version); 
      _this.wms_capabilities_[index] = result; 
      return index; 
     }).then(
      function() { return _this.parse_capabilities(); } 
      // or else 
      // _this.parse_capabilities.bind(_this) 
      // pick the one you like more 
     ); 
    }); 
}; 
+0

Bu işe yaramaz: "parse_capabilities" yönteminin içindeki "this", "instance" bağlamına değil jQuery'nin içeriğine bağlı olmaz (çünkü parse_capabilities' olarak adlandırılan jQuery'dir. –

+0

Bu yaklaşımı zaten önerdim şimdi silindi) - OP bu yöntemin farkında olduğunu (muhtemelen bu soruya göre düzenlemesi gerektiğini) söylüyor, ancak mümkünse kaçınmak istiyor ve @deceze doğru bir şekilde işaret ediyor: "Bu, o zaman (self.parse_capabilities)" için hiç yardımcı değil. " –

+0

Düzenlendi, şimdi çalışmalı, daha az" güzel "olsa da ... belki de 'bind()' daha iyi olurdu. –

1

Sen "sert bağlamak" Böyle bir yöntem olabilir:

function Foo() { 
    this.bar = this.bar.bind(this); 
} 

Foo.prototype.bar = function() { 
    return console.log(this.baz); 
}; 

arada, o CoffeeScript Bunu yaparken derler ne:

class Foo 
    bar: => 
    console.log @baz 

=> operatör bağlamın bu korunmasını neden olur.

+0

Hala bununla nasıl yardımcı emin değilim prototip üzerinde parse_capabilities' yöntemi? Bence durum ne olursa olsun, bunu hala '.then() 'çağrısına bağlamak zorunda kalacaksınız? –

+0

Bu, parse_capabilities' yönteminde çalışır. Bununla birlikte, içsel anonim işlevlere uygulanamaz. –

İlgili konular