Функцию компиляции можно использовать для изменения модели DOM до того, как результирующая функция шаблона будет привязана к области видимости.
Рассмотрим следующий пример:
<div my-directive></div>
Вы можете использовать функцию компиляции, чтобы изменить шаблон DOM следующим образом:
app.directive('myDirective', function(){
return {
// Compile function acts on template DOM
// This happens before it is bound to the scope, so that is why no scope
// is injected
compile: function(tElem, tAttrs){
// This will change the markup before it is passed to the link function
// and the "another-directive" directive will also be processed by Angular
tElem.append('<div another-directive></div>');
// Link function acts on instance, not on template and is passed the scope
// to generate a dynamic view
return function(scope, iElem, iAttrs){
// When trying to add the same markup here, Angular will no longer
// process the "another-directive" directive since the compilation is
// already done and we're merely linking with the scope here
iElem.append('<div another-directive></div>');
}
}
}
});
Таким образом, вы можете использовать функцию compile
, чтобы изменить DOM шаблона на все, что вам нравится, если этого требует ваша директива.
В большинстве случаев tElem
и iElem
будут одним и тем же элементом DOM, но иногда они могут различаться, если директива клонирует шаблон для штамповки нескольких копий (см. ngRepeat
).
За кулисами Angular использует двухсторонний процесс рендеринга (компиляция + ссылка), чтобы удалить копии скомпилированного фрагмента DOM, чтобы Angular не приходилось обрабатывать (= директивы синтаксического анализа) один и тот же DOM снова и снова для каждого экземпляра. в случае, если директива удаляет несколько клонов, что приводит к гораздо лучшей производительности.
Надеюсь, это поможет!
ДОБАВЛЕНО ПОСЛЕ КОММЕНТАРИЯ:
Разница между функциями template
и compile
:
Функция шаблона
{
template: function(tElem, tAttrs){
// Generate string content that will be used by the template
// function to replace the innerHTML with or replace the
// complete markup with in case of 'replace:true'
return 'string to use as template';
}
}
Функция компиляции
{
compile: function(tElem, tAttrs){
// Manipulate DOM of the element yourself
// and return linking function
return linkFn(){};
}
}
Функция шаблона вызывается до вызова функции компиляции.
Хотя они могут выполнять почти идентичные действия и иметь одну и ту же «подпись», ключевое отличие состоит в том, что возвращаемое значение функции шаблона заменит содержимое директивы (или полную разметку директивы, если replace: true
), в то время как функция компиляции ожидается для программного изменения DOM и возврата функции ссылки (или объекта с функцией предварительной и последующей ссылки).
В этом смысле вы можете думать о функции шаблона как о своего рода удобной функции, позволяющей не использовать функцию компиляции, если вам просто нужно заменить содержимое строковым значением.
Надеюсь, это поможет!
person
jvandemo
schedule
06.01.2014
$compile
и использовать его. Вместо этого Angular сделает это внутри - person charlietfl   schedule 06.01.2014attrs
? Вот так"<div size=\"" + attrs.size + "\"></div>"
. - person Maksym Bykovskyy   schedule 08.01.2014if(attrs.type=='somVal') {return string1;}else{ return string2}
- person charlietfl   schedule 08.01.2014