2015-12-07 1 views
2

В Javascript я вижу, что есть уже интерфейс Event и ребенок с именем CustomEvent. Мне интересно, хороши ли они для типа C# event/delegate. Я хочу создать способ подписки на события, но я зациклился на том, чтобы отменить подписку изящно.Общие события Javascript

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](); 
     } 
    }  
} 

Во-первых, как я могу подписаться? Это мои идеи:

C# Метод

var myClass = new MyClass(); 
myClass.onDoCoolThing += myCallbackFunction.bind(this, param1); 
myClass.onDoCoolThing += myOtherCallbackFunction.bind(this, param1); 

стиль Массив Если C# метод не представляется возможным:

myClass.onDoCoolThing.push(myCallBackFunction.bind(this, param1); 

Я не знаю, как бы я отказаться от те, если позволяют, объект с обратным вызовом был уничтожен. Будет ли это GCed?

Вот почему мне интересно, была ли эта работа выполнена и найдена в нативном объекте, но я ее вообще не вижу.

+0

Я неясно, что вы просите .. вы просто хотите, чтобы связать/отвязать функцию событий? Или есть больше, чем это. – acupajoe

+1

Начать с [этой статьи] (https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events) – hindmost

+0

@acupajoe Я пытаюсь воссоздать события C# (Java, вероятно, имеет то же самое) , Я хочу, чтобы подписаться на события объектов и отказаться от подписки. Я должен иметь возможность контролировать, когда эти события запускаются (т. Е. В пределах области функции) – BarryBones41

ответ

1

Нет никакого способа сделать это чисто в ванили JS.

Однако jQuery предоставляет метод делегата, поэтому вы можете назначить обработчики после загрузки DOM. Просто вставьте библиотеку jQuery. Вы можете написать функцию вручную, чтобы сделать это в Vanilla JS, но гораздо проще позволить jQuery обрабатывать ее для вас.

http://api.jquery.com/delegate/

+1

", если эта работа выполнена и найдена в ** родном ** объекте" – acupajoe

+0

В vanilla JS нет метода, который предусматривает назначение делегатов. Вы должны написать свой собственный. Я предоставляю более быстрый путь. Насколько я видел, ванильный способ сделать это в JS не очень хорошо поддерживается кросс-клиентом. – Korgrue

+1

Я знаю об этом, просто объяснял причину того, почему вы занижены. Он попросил родной способ его реализовать. Если нет собственного способа сделать это, он должен быть указан в ответе, прежде чем предлагать альтернативу. – acupajoe

Смежные вопросы