λύση Steven Ickman είναι βολικό, αλλά ελλιπής. Danny Μπέκετ και οι απαντήσεις του Σαμ είναι μικρότερη και πιο εγχειρίδιο, και αποτυγχάνουν στην ίδια γενική περίπτωση που έχει επανάκλησης που χρειάζεται τόσο δυναμικές και λεξιλογικά scoped «αυτό» την ίδια στιγμή. Μετάβαση στο κωδικό μου αν μου εξήγηση είναι κάτω TL? DR ...
Θα πρέπει να διατηρηθεί «η» για τη δυναμική οριοθέτηση του πεδίου για χρήση με callbacks βιβλιοθήκη, και θα πρέπει να έχουν ένα «αυτό» με λεξιλογικό οριοθέτηση του πεδίου στην περίπτωση τάξη. Υποστηρίζω ότι είναι πιο κομψό να περάσει το παράδειγμα σε μια γεννήτρια επανάκλησης, αφήνοντας ουσιαστικά το κλείσιμο των παραμέτρων πάνω από το παράδειγμα της κατηγορίας. Ο συντάκτης σας λέει αν χάσατε κάτι τέτοιο. Χρησιμοποιώ μια σύμβαση καλώντας τα λεκτικά με εύρος παραμέτρου «outerThis», αλλά «αυτο» ή ένα άλλο όνομα θα μπορούσε να είναι καλύτερη.
Η χρήση του «αυτό» λέξη-κλειδί κλαπεί από τον κόσμο OO, και όταν γραφομηχανή, η επιτροπή ενέκρινε (από ECMAScript 6 specs υποθέτω), που συγχέονται μια λεκτική scoped έννοια και δυναμικά με εύρος έννοια, κάθε φορά που μια μέθοδο που ονομάζεται από μια διαφορετική οντότητα . Είμαι λίγο θυμωμένη σε αυτό? Θα προτιμούσα ένα «εγώ» λέξη-κλειδί στη γραφομηχανή, έτσι ώστε να μπορώ να παραδώσει το λεξιλογικά με εύρος παράδειγμα αντικειμένου μακριά από αυτό. Εναλλακτικά, JS θα μπορούσε να επαναπροσδιοριστούν να απαιτεί ρητή παράμετρο πρώτη θέση «καλών» όταν χρειάζεται (και, επομένως, να σπάσει όλα τα ιστοσελίδες μονομιάς).
Εδώ είναι η λύση μου (αποκόπηκαν από μια μεγάλη κατηγορία). Πάρτε μια αρσενική χήνα, ιδίως για τον τρόπο καλούνται οι μέθοδοι, και το σώμα του «dragmoveLambda» ιδίως:
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;
}
}
}