Как понять "терминал" директивы?
На этой странице: http://docs.angularjs.org/guide/directive
Директива Определение Объекта
Терминал
Если установлено значение true, то текущий приоритет будет последним набором директив, которые будут выполняться (любые директивы с текущим приоритетом будут выполняться, поскольку порядок выполнения с тем же приоритетом не определен).
Я не очень хорошо понимаю Что значит current priority
имею в виду? Если есть такие директивы:
- директива1 с {приоритетом: 1, терминал: ложь}
- директива2 с {приоритетом: 10, терминал: ложь}
- директива3 с {приоритетом: 100, терминал: ложь}
- directive4 с { priority: 100, terminal: true} // это верно
- директива 5 с {приоритет: 1000, терминал: ложь}
Пожалуйста, обратите внимание 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, обе они будут применены, потому что порядок директив с одинаковым приоритетом не определен.
Обратите внимание, что это относится только к директивам, которые находятся на одном элементе.