Какая разница между функциями "postLink" 2 в директиве?
Из документа угловых символов при определении директивы существует a postLink
in compile
, a postLink
in link
myModule.directive('directiveName', function factory(injectables) {
var directiveDefinitionObject = {
priority: 0,
template: '<div></div>',
templateUrl: 'directive.html',
replace: false,
transclude: false,
restrict: 'A',
scope: false,
compile: function compile(tElement, tAttrs, transclude) {
return {
pre: function preLink(scope, iElement, iAttrs, controller) { ... },
post: function postLink(scope, iElement, iAttrs, controller) { ... }
}
},
link: function postLink(scope, iElement, iAttrs) { ... }
};
return directiveDefinitionObject;
});
Какая разница между ними? Я замечаю, что postLink
в link
имеет аргумент меньше, чем тот, который находится в compile
. И есть ли другая разница?
Ответы
Ответ 1
Они ничем не отличаются от того, что у вас есть, это просто psuedo-код из документации. Функция postLink является самой важной, поэтому существует множество способов объявить ее.
Вот пример Plunker в качестве примера...
... и вот какой-то код psuedo, показывающий разные объявления функции postLink:
app.directive('dir1', function () {
return function(scope, elem, attr) {
//this is the same
};
});
app.directive('dir2', function () {
return {
link: function(scope, elem, attr) {
//this is the same
}
};
});
app.directive('dir3', function () {
return {
compile: function compile(tElement, tAttrs, transclude) {
return {
post: function postLink(scope, elem, attrs) {
//this is the same
}
}
}
};
});
... вам нужен только один.
Ответ 2
Существенное различие заключается в том, что в функции предварительной ссылки дочерние элементы еще не связаны. Но в функции пост-ссылки он имеет.
Это имеет значение для манипуляций с DOM. Поскольку процесс связывания может дополнительно управлять DOM, для директивы только безопасно управлять DOM, когда его дочерние элементы уже связаны, - и это справедливо только в функции post-link.