Steven Ickman çözümü kullanışlı ama eksik. Danny Becket ve Sam'in cevapları daha kısa ve daha manuel, ve dinamik ve lexically kapsamlı hem "bu" aynı zamana ihtiyacı bir geri arama sahip aynı genel durumda başarısız. Aşağıda benim açıklama TL ise benim kod atlama; DR ...
Ben "bu" dinamik kütüphane geri aramaları ile kullanılmak üzere kapsama alınması için korumak gerekir ve ben olması gereken bir "bu" sınıf örneğine sözcük kapsama alınması ile. Ben etkili sınıf örneği üzerinden parametre kapatılması icar, bir geri arama jeneratörüne örneğini geçmek en zarif olduğunu savunuyorlar. Bunu yaparken cevapsız eğer derleyici söyler. Ben lexically kapsamlı parametresi "outerThis" çağıran kuralı, ancak "kendini" kullanabilir veya başka bir isim daha iyi olabilir.
"Bu" anahtar kelime kullanımı OO dünyasından çalınmış ve typescript (sanırım ECMAScript'e 6 spesifikasyonları) o zaman kabul, onlar bir yöntemdir farklı bir varlık tarafından arandığı her bir lexically kapsamlı kavram ve dinamik kapsamlı kavram, conflated edilir . Bu işte biraz kızgın değilim; Bunu ortadan lexically kapsamlı nesne örneğini el böylece ben daktilo bir "öz" anahtar kelimesini tercih ediyorum. Alternatif olarak, JS gerekli (ve böylece bir çırpıda tüm web sayfaları kırmak) olduğunda açık bir birinci pozisyon "arayan" parametresini gerektirecek şekilde yeniden tanımlandı olabilir.
İşte (büyük bir sınıftan çıkartıldı) benim çözüm. yöntemler denir gidiş yönünden özellikle bir kaz ve özellikle de "dragmoveLambda" gövdesini atın:
export class OntologyMappingOverview {
initGraph(){
...
// Using D3, have to provide a container of mouse-drag behavior functions
// to a force layout graph
this.nodeDragBehavior = d3.behavior.drag()
.on("dragstart", this.dragstartLambda(this))
.on("drag", this.dragmoveLambda(this))
.on("dragend", this.dragendLambda(this));
...
}
dragmoveLambda(outerThis: OntologyMappingOverview): {(d: any, i: number): void} {
console.log("redefine this for dragmove");
return function(d, i){
console.log("dragmove");
d.px += d3.event.dx;
d.py += d3.event.dy;
d.x += d3.event.dx;
d.y += d3.event.dy;
// Referring to "this" in dynamic scoping context
d3.select(this).attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });
outerThis.vis.selectAll("line")
.filter(function(e, i){ return e.source == d || e.target == d; })
.attr("x1", function(e) { return e.source.x; })
.attr("y1", function(e) { return e.source.y; })
.attr("x2", function(e) { return e.target.x; })
.attr("y2", function(e) { return e.target.y; });
}
}
dragging: boolean =false;
// *Call* these callback Lambda methods rather than passing directly to the callback caller.
dragstartLambda(outerThis: OntologyMappingOverview): {(d: any, i: number): void} {
console.log("redefine this for dragstart");
return function(d, i) {
console.log("dragstart");
outerThis.dragging = true;
outerThis.forceLayout.stop();
}
}
dragendLambda(outerThis: OntologyMappingOverview): {(d: any, i: number): void} {
console.log("redefine this for dragend");
return function(d, i) {
console.log("dragend");
outerThis.dragging = false;
d.fixed = true;
}
}
}