Почему функция preLink используется в угловой директиве ngForm вместо обычной функции postLink?

Внутри angular.js в определении директивы ngForm (form) функция компиляции возвращает только функцию preLink. Почему это должно быть preLink вместо обычного postLink?

Следующий код взят из главной ветки angular.js:

var formDirective = {
  name: 'form',
  restrict: isNgForm ? 'EAC' : 'E',
  controller: FormController,
  compile: function ngFormCompile(formElement) {
    // Setup initial state of the control
    formElement.addClass(PRISTINE_CLASS).addClass(VALID_CLASS);
    return {
      pre: function ngFormPreLink(scope, formElement, attr, controller) {
        // if `action` attr is not present on the form, prevent the default action (submission)
        if (!('action' in attr)) {
          // we can't use jq events because if a form is destroyed during submission the default
          // action is not prevented. see #1238
          //
          // IE 9 is not affected because it doesn't fire a submit event and try to do a full
          // page reload if the form was destroyed by submission of the form via a click handler
          // on a button in the form. Looks like an IE9 specific bug.
          var handleFormSubmission = function(event) {
            scope.$apply(function() {
            controller.$commitViewValue();
            controller.$setSubmitted();
          });
        event.preventDefault();
        };
        ...

person Alireza Mirian    schedule 19.01.2015    source источник


Ответы (1)


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

На практике порядок выполнения функций связи следующий:

  1. родительская предварительная ссылка
  2. дочерняя предварительная ссылка
  3. дочерняя ссылка
  4. ссылка на родительский пост
person Jussi Kosunen    schedule 19.01.2015