@ risposta di Poke è l'idea giusta, ma ci sono un paio di problemi:
function thisAsThat (callback) {
return function() {
return callback.apply(null, [this].concat(arguments));
}
}
First, arguments
non è una vera e propria gamma, in modo da chiamare concat()
come indicato sopra si tradurrà in un array nidificato:
[0] = this
[1] = [ [0] = param1, [1] = param2, ... ]
per risolvere questo problema, use slice() per convertire arguments
ad una vera matrice:
return callback.apply(null, [this].concat(Array.prototype.slice.call(arguments)));
Risultato:
[0] = this
[1] = param1
[2] = param2
...
In secondo luogo, passando null
per il primo parametro da applicare() non ha funzionato per me; Dovevo superare la classe Foo this
in modo esplicito. Ecco un esempio completo:
class Foo {
public setClickHandler(checkbox: JQuery): void {
checkbox.click(this.captureThis(this.onCheckboxClick));
}
protected onCheckboxClick(checkbox: HTMLInputElement, event: Event) {
// 'this' refers to class Foo
}
protected captureThis(callback) {
var self = this;
return function() {
return callback.apply(self, [this].concat(Array.prototype.slice.call(arguments)));
}
}
}
Con questo approccio, il callback onCheckboxClick()
ha accesso sia alla classe di this
e l'elemento casella di controllo (come il primo parametro) che sarebbe stato this
in un tipico callback click
evento. Lo svantaggio dell'uso di captureThis()
è che si perde la sicurezza del tipo di TypeScript per il callback, quindi Typescript non può impedirti di incasinare la firma della funzione di callback.
Utilizzare una funzione normale e memorizzare "questo" esterno in una variabile. – Oriol
"... e associa lessicamente questo valore" https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Functions/Arrow_functions – coma
Non dimenticare il buon ol ''event.currentTarget' a ottenere il target dell'evento indipendentemente dall'associazione 'this' (si noti che sarà un' HTMLElement', non un oggetto jQuery). –