ASP.NET AJAX Function.createDelegate против Function.createCallback? - PullRequest
3 голосов
/ 19 мая 2009

Я читаю книгу Мэннинга - asp.net в действии. на странице 54-58 описаны клиентские делегаты и обратные вызовы.

короче:

с клиентским делегатом вы можете изменить переменную this в самом обработчике событий, чтобы отразить другой объект. (поэтому объект DOM не будет вызывать событие для событий DOM)

с помощью обратного вызова вы можете передать context object вашему обработчику событий, который будет доступен в обработчике событий как второй аргумент / параметр .

с обоими вы можете «передать» объект в обработчик событий (будь то this или context object), который не будет доступен для обработчика событий (в его рамках).

Чем отличаются эти клиентские делегаты от обратных вызовов?

Мне кажется, что:

только объект , который вы хотите быть доступным в обработчике событий, доступен по-разному :

  • клиентский делегат: this
  • обратный вызов: second argument

... и возможно, что только у обратного вызова есть DomEvent (первый параметр) , , но не клиентский делегат ?! ??

Это правильно? Это все?

Может быть, вы сможете объяснить разницу между клиентскими делегатами и обратными вызовами.

1 Ответ

3 голосов
/ 19 сентября 2009

Я не совсем уверен в этом, но я думаю, что обратный вызов - это то, что происходит, когда страница отправляется на сервер.

Клиент создает делегат для создания делегата для вызова методов JavaScript.

Метод Function.CreateDelegate () действительно полезен.

Скажем, вы хотите обработать событие нажатия кнопки в JavaScript. Объект «this», доступный в функции, которая обрабатывает нажатие кнопки, является кнопкой, по которой был нажат.

Теперь скажите, что у вас есть объект JavaScript, который фиксирует событие нажатия кнопки и что-то делает. Обычно «this» относится к самому объекту JavaScript, но поскольку метод Object используется для обработки события нажатия кнопки, «this» фактически относится к объекту, вызвавшему событие: кнопку.

Чтобы обойти это, был создан метод JavaScript apply . Таким образом, вместо захвата события нажатия кнопки, указав метод объекта JavaScript в методе attachEvent / attachEventListener (или метод $ addHandler () в Ajax.NET Framework), вы фактически использовали бы метод apply () с этими attachEvent / attachEventListener. Это изменяет контекст так, что «this» ссылается на объект JavaScript вместо объекта, вызвавшего событие.

Теперь метод Function.CreateDelegate () делает больше, чем просто использует метод apply при создании клиентского делегата.

Посмотрите на код:

Function.createDelegate = function Function$createDelegate(instance, method) {
    /// <summary locid="M:J#Function.createDelegate" />
    /// <param name="instance" mayBeNull="true"></param>
    /// <param name="method" type="Function"></param>
    /// <returns type="Function"></returns>
    var e = Function._validateParams(arguments, [
    {name: "instance", mayBeNull: true},
    {name: "method", type: Function}
    ]);
    if (e) throw e;
    return function() {
      return method.apply(instance, arguments);
    }
} 

Есть одна вещь, которую вы должны знать о методе apply (). Когда вы выполняете его, он выполняет метод, который является делегатом. Чтобы обойти это, метод createDelegate делает выше.

Итак, я не совсем уверен, как обратный вызов вписывается в это, но использование метода createDelegate () - хорошая идея, когда ваши объекты JavaScript обрабатывают события, вызванные каким-либо элементом пользовательского интерфейса.

Я предполагаю, что обратный вызов - это действие, которое происходит, когда запрос отправляется из браузера на сервер. Большую часть времени метод __doPostback используется для предварительной обработки обратного вызова. Этот метод принимает 2 параметра ... объект, который вызвал обратную передачу / обратный вызов на сервер, и аргументы для обратной передачи / обратного вызова. Это было бы что-то совершенно другое для клиентского делегата.

Счастливое кодирование

-Frinny

...