Steven Ickman megoldása praktikus, de nem teljes. Danny Becket és Sam válaszok rövidebb és kézi, és nem ugyanabban az általános esetben, amelynek visszahívás, hogy szüksége van mind a dinamikus és közéjük egy távcsöves „ez” ugyanabban az időben. Ugrás a kódomat, ha a magyarázat alább TL; DR ...
Meg kell őrizni „ez a” dinamikus tartalom meghatározás használható könyvtár callback, és azt kell, hogy van egy „ez” a lexikális hatókör az osztály példányát. Azt állítják, hogy ez a legelegánsabb át a példány egy visszahívást generátor hatékonyan hagyta, hogy a paraméter lezárás az osztály példányát. A fordító azt mondja, ha nem fogadott ezzel. ÉN használ egy ilyen egyezmény hívja a lexikailag hatókörös paraméter „outerThis”, hanem „saját”, vagy más néven lehet jobb.
A használata a „this” kulcsszót ellopták az OO világban, amikor géppel elfogadja (az ECMAScript 6 specifikációk Felteszem), akkor nem keveri a szótanilag távcsöves koncepció és egy dinamikusan távcsöves fogalom, ha egy metódus egy másik entitás . Én egy kicsit bosszús ebben; Inkább egy „saját” címszó géppel, így én is viszont a lexikailag hatókörös objektum példányt le róla. Felváltva, JS lehetne újra igényel kifejezett first-helyzet „hívó” paramétert ha szükség van rá (és így szünet minden weboldalakat egy csapásra).
Itt a megoldás (kivágjuk a nagy osztály). Vegyünk egy gúnár, különösen az, ahogyan a módszereket nevezzük, és a test „dragmoveLambda” különösen:
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;
}
}
}