W Javascript widzę, że już istnieje Event
interfejs i dziecko wywołane CustomEvent
. Zastanawiam się, czy są to dobre dopasowania dla typu c # event
/ delegate
system. Chcę stworzyć sposób subskrybowania wydarzeń, ale utknąłem na tym, jak bezpiecznie zrezygnować z subskrypcji.
function MyClass(){
this.onDoCoolThing = null;
}
MyClass.prototype.doCoolThing = function(){
// do thing
if(this.onDoCoolThing !== null){
for(var i = 0; i < this.onDoCoolThing.length; i++){
if(this.onDoCoolThing[i] instanceof Function)
this.onDoCoolThing[i]();
}
}
}
Po pierwsze, w jaki sposób mogę subskrybować? Oto moje pomysły:
Metoda C #
var myClass = new MyClass();
myClass.onDoCoolThing += myCallbackFunction.bind(this, param1);
myClass.onDoCoolThing += myOtherCallbackFunction.bind(this, param1);
Styl tablicy Jeśli metoda C # nie jest możliwa:
myClass.onDoCoolThing.push(myCallBackFunction.bind(this, param1);
Nie wiem, jak mógłbym wypisać się z tych, jeśli powiedzmy, obiekt z wywołaniem zwrotnym został zniszczony. Czy będzie to GCed?
Dlatego zastanawiam się, czy ta praca została wykonana i znajduje się w rodzimym obiekcie, ale nie widzę jej nigdzie.
Odpowiedzi:
1 dla odpowiedzi № 1Nie ma sposobu, aby zrobić to czysto w waniliowym JS.
Jednak jQuery zapewnia metodę delegowania, więc Tymoże przypisać programy obsługi po załadowaniu DOM. Wystarczy pobrać bibliotekę jQuery. Możesz napisać funkcję ręcznie, aby zrobić to w Vanilla JS, ale jest znacznie łatwiej pozwolić jQuery obsłużyć to za ciebie.
http://api.jquery.com/delegate/