Как понять "терминал" директивы?

На этой странице: http://docs.angularjs.org/guide/directive

Объект определения директивы

терминал

Если установлено значение true, то текущий приоритет будет последним набором директив, который будет выполняться (любые директивы в текущем приоритете все равно будут выполняться, так как порядок выполнения с таким же приоритетом равен undefined).

Я не очень хорошо это понимаю. Что означает current priority? Если есть такие директивы:

  • директива1 с {priority: 1, terminal: false}
  • директива2 с {priority: 10, terminal: false}
  • директива3 с {priority: 100, terminal: false}
  • директива4 с {priority: 100, terminal: true}//это верно
  • директива5 с {priority: 1000, terminal: false}

Обратите внимание, что directive4 имеет terminal:true, а другие имеют false.

Если в html-теге есть все 5 директив:

<div directive1 directive2 directive3 directive4 directive5></div>

Каков порядок выполнения 5 директив?

Ответ 1

Приоритет

Приоритет имеет значение только при наличии нескольких директив для одного элемента. Приоритет определяет, в каком порядке эти директивы будут применяться/начаты. В большинстве случаев вам не нужен приоритет, но иногда, когда вы используете функцию компиляции, вы должны убедиться, что ваша функция компиляции работает в первую очередь.

Терминал

Свойство терминала также применимо только для директив, которые находятся на одном и том же элементе HTML. То есть, если у вас <div my-directive1></div> <div my-directive2></div>, priority и terminal в ваших директивах my-directive1 и my-directive2 не будут влиять друг на друга. Они будут влиять только друг на друга, если у вас <div my-directive1 my-directive2></div>.

Свойство терминала сообщает Angular пропустить все директивы этого элемента, которые появляются после него (более низкий приоритет). Таким образом, этот код может очистить его:

myModule.directive('myDirective1', function() {
    return {
        priority: 1,
        terminal: false,
        link: function() {
            console.log("I'm myDirective1");
        }
    }
});

myModule.directive('myDirective2', function() {
    return {
        priority: 10,
        terminal: true,
        link: function() {
            console.log("I'm myDirective2");
        }
    }
});

myModule.directive('myDirective3', function() {
    return {
        priority: 100,
        terminal: false,
        link: function() {
            console.log("I'm myDirective3");
        }
    }
});

Для этого вы увидите только "I'm myDirective2" и "I'm myDirective3" в консоли.

<div my-directive1 my-directive2 my-directive3></div>

Но для этого вы также увидите "I'm myDirective1", так как они находятся на разных элементах.

<div my-directive1></div>
<div my-directive2></div>
<div my-directive3></div>

Оригинальный пост

В вашем примере сначала применяются директивы с приоритетом 100 и 1000, так как сначала применяется директива с более высоким приоритетом, поэтому сначала применяется приоритет 1000 с приоритетом.

Если в этом случае у вас есть две директивы с приоритетом 100, оба они будут применяться, поскольку порядок директив с таким же приоритетом равен undefined.

Обратите внимание, что это относится только к директивам, которые находятся на одном элементе.