Ich implementiere einen Web Map Client, der auf OpenLayers3 aufbaut, der in der Lage sein sollte, sich mit mehreren WMS Servern zu verbinden, nach WMS Capabilities zu fragen und Layer anzuzeigen, die von Servern angekündigt werden.Wie verbinde ich das (bei jeder Funktion)?
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));
};
Der obige Code funktioniert gut, aber ich muss bind(this)
jedes Mal möchte ich eine Funktion aufrufen, die Zugriff auf „private“ Variablen von MyMapClient
‚s Instanz benötigt. Gibt es keinen besseren Weg, um auf Instanz-Interna konsistent zuzugreifen, ohne die Lesbarkeit zu beeinträchtigen?
Das wird nicht funktionieren: Die Methode 'this' innerhalb der' parse_capabilities' wäre nicht an den Kontext "instance" gebunden, sondern an den Kontext von jQuery (weil jQuery 'parse_capabilities' aufruft.) –
Ich habe diesen Ansatz bereits vorgeschlagen (jetzt gelöscht) - OP sagt, dass er sich dieser Methode bewusst ist (sollte das wahrscheinlich in die Frage bearbeiten), aber wenn möglich vermeiden will, und @deceze hat zu Recht auf "Das hilft dann nicht" (self.parse_capabilities) hingewiesen " –
Bearbeitet, sollte nun funktionieren, weniger" schön "aber ... vielleicht wäre' bind() 'einfach besser. –