2015-04-12 3 views
1

Есть ли способ в Javascript иметь делегата, подобного тому, что есть в C#?Делегирование вызова функции в Javascript

Пример в C#

Object.onFunctionCall = delegate (vars v) { 
    Console.WriteLine("I can do something in this private delegate function"); 
}; 

Я хотел бы с моим Javascript, чтобы мой главный объект сделать что-то в течение длительного времени, и расстреливали делегат один раз в некоторое время, чтобы дать немного обновления. Все, что без необходимости менять сам код моего класса для настройки на веб-страницу.

function mainObject() { 
    this.onUpdate = function() { //Potentially the delegate function here 
    } 
} 

var a = new mainObject(); 
a.onUpdate = Delegate { 
     $(".myText").text("Just got a delegate update"); 
} 

Я не знаю, если это достаточно ясно .. нету найдено RESSOURCES на это, так что я полагаю, что нет никакого способа сделать это?

ПРИМЕЧАНИЕ: Я не ищу в Jquery Нажмите делегатов мероприятия здесь, но в делегировании вызов функции, как, как это работает в C#

Позвольте мне знать,

+1

* Все * функции в JavaScript (созданные с помощью 'function ..') * являются * 'делегатами', то есть [Функции первого класса] (http://en.wikipedia.org/wiki/ Первое class_function). Вы также можете быть заинтересованы в [Function.bind] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind), чтобы контекст 'this' сохранялся (что более похоже на C#). Также прочитайте связанные вопросы. – user2864740

+0

У вас есть пример функции, которая автоматически срабатывает «Авто», как указано в C#? – Stacknerd

+0

Показанный код JavaScript будет «работать» как есть, если заменить 'Delegate {' на 'function() {'. Например, внизу: вызов 'a.onUpdate()' обновил бы текст. Если говорить о * событиях * в C# (которые сами не являются делегатами *), то это другая концепция. Приведенный пример кода C# не будет «автоматически срабатывать». Не уверен, что имеется в виду. – user2864740

ответ

2

Что вы ищете является " Шаблон наблюдателя ", как описано, например. here.

Но поскольку вас интересует jQuery, вам не нужно беспокоиться о написании шаблона наблюдателя для себя. jQuery уже реализует наблюдателя под видом своего .on() method, который может быть вызван в коллекции jQuery, чтобы вызвать функцию (ы) обратного вызова при каждом отправке собственного или настраиваемого события.

Вот пример:

$(function() { 
    //attach a custom event handler to the document 
    $(document).on('valueChange', function (evt) { 
     $(this).find("#s0").text(evt.type); 
     $(this).find("#s1").text(evt.value); 
     $(this).find("#s2").text(evt.change); 
     $(this).find("#s3").text(evt.timestamp).toLocaleString(); 
    }); 

    //customEvent(): a utility function that returns a jQuery Event, with custom type and data properties 
    //This is necessary for the dispatch an event with data 
    function customEvent(type, data) { 
     return $.extend($.Event(type||''), data||{}); 
    }; 

    //randomUpdate(): fetches data and broadcasts it in the form of a 'changeValue' custom event 
    //(for demo purposes, the data is randomly generated) 
    function randomUpdate() { 
     var event = customEvent('valueChange', { 
      value: (10 + Math.random() * 20).toFixed(2), 
      change: (-3 + Math.random() * 6).toFixed(2), 
      timestamp: new Date() 
     }); 
     $(document).trigger(event);//broadcast the event to the document 
    } 
}); 

Here's a demo, в комплекте с «старт» и «стоп» кнопки для обычного «интервала» отправки пользовательского события.

Примечание

  • В некоторых случаях это может быть более подходящим для трансляции события в данные четыре охватывает индивидуально.
  • В Интернете вы найдете упоминание более удобного синтаксиса jQuery.event.trigger({...}). К сожалению, это была недокументированная функция jQuery, которая исчезла при версии v1.9 или около того.
Смежные вопросы