Ao criar uma diretiva, você pode colocar o código no compilador, na função de link ou no controlador.
Nos documentos, eles explicam que:
- função de compilação e link são usadas em diferentes fases do ciclo angular
- controladores são compartilhados entre diretivas
No entanto, para mim não está claro, que tipo de código deve ir aonde.
Por exemplo: Posso criar funções em compilação e anexá-las ao escopo no link ou apenas anexar funções ao escopo no controlador?
Como os controladores são compartilhados entre diretivas, se cada diretiva pode ter seu próprio controlador? Os controladores são realmente compartilhados ou são apenas as propriedades do escopo?
angularjs
angularjs-directive
Schacki
fonte
fonte
Respostas:
Compilar:
Essa é a fase em que o Angular realmente compila sua diretiva. Essa função de compilação é chamada apenas uma vez para cada referência à diretiva especificada. Por exemplo, digamos que você esteja usando a diretiva ng-repeat. O ng-repeat precisará procurar o elemento ao qual está anexado, extrair o fragmento html ao qual está anexado e criar uma função de modelo.
Se você usou o HandleBars, os modelos de sublinhado ou equivalente, é como compilar os modelos para extrair uma função de modelo. Para esta função de modelo, você passa dados e o valor de retorno dessa função é o html com os dados nos lugares certos.
A fase de compilação é a etapa em Angular que retorna a função de modelo. Essa função de modelo em angular é chamada de função de vinculação.
Fase de ligação:
A fase de vinculação é onde você anexa os dados ($ scope) à função de vinculação e deve retornar o html vinculado. Como a diretiva também especifica para onde esse html vai ou o que muda, já é bom ir. Essa é a função na qual você deseja fazer alterações no html vinculado, ou seja, o html que já possui os dados anexados. Em angular, se você escrever um código na função de vinculação, geralmente é a função de pós-link (por padrão). É um tipo de retorno de chamada que é chamado depois que a função de vinculação vincula os dados ao modelo.
Controlador:
O controlador é um local onde você coloca alguma lógica específica da diretiva. Essa lógica também pode entrar na função de vinculação, mas você teria que colocar essa lógica no escopo para torná-la "compartilhável". O problema disso é que você estaria corrompendo o escopo com o material das diretivas, o que não é realmente o esperado. Então, qual é a alternativa se duas diretivas querem conversar entre si / cooperar? É claro que você poderia colocar toda essa lógica em um serviço e fazer com que ambas as diretivas dependessem desse serviço, mas isso apenas traz mais uma dependência. A alternativa é fornecer um controlador para esse escopo (geralmente isolar o escopo?) E, em seguida, esse controlador é injetado em outra diretiva quando essa diretiva "requer" a outra.
fonte
controller
função de diretiva é executado após a compilação, mas antespre-link
em uma ramificação da árvore DOM local. Além disso, as funçõescontroller
epre-link
são executadas atravessando a ramificação DOM local de maneira descendente . Depois disso,post-link
é executado de maneira ascendente .controller
vez de emlink
qualquer lugar? Para que não precise alterar o código no futuro se o método precisar ser compartilhado ou se for introduzida alguma lógica? Existe alguma armadilha no usocontroller
o tempo todo em vez do link?Queria adicionar também o que o livro O'Reily AngularJS da Equipe do Google tem a dizer:
fonte
A
directive
permite estender o vocabulário HTML de forma declarativa para a construção de componentes da web. Ong-app
atributo é uma diretiva, assim comong-controller
e todos osng- prefixed attributes
. Directivas pode serattributes
,tags
ou mesmoclass
names
,comments
.Como nascem as diretrizes (
compilation
einstantiation
)Compilar: Usaremos a
compile
funçãomanipulate
no DOM antes de ser renderizada e retornaremos umalink
função (que tratará do vínculo para nós). Este também é o lugar para colocar todos os métodos que precisam ser compartilhados com todainstances
essa diretiva.link: Usaremos a
link
função para registrar todos os ouvintes em um elemento DOM específico (clonado no modelo) e configurar nossas ligações para a página.Se configurados na
objeto.
compile()
função, eles seriam configurados apenas uma vez (que geralmente é o que você deseja). Se definido nalink()
função, ele será definido sempre que o elemento HTML for vinculado aos dados noCompile
A função retorna a funçãopre
epost
link. Na função de pré-link, temos o modelo de instância e também o escopo docontroller
, mas ainda assim o modelo não está vinculado ao escopo e ainda não possui conteúdo transcluído.Post
A função de link é onde o link de postagem é a última função a ser executada. Agora otransclusion
está completo,,the template is linked to a scope
e oview will update with data bound values after the next digest cycle
. Alink
opção é apenas um atalho para configurar umapost-link
função.controlador: O controlador de diretiva pode ser passado para outra fase de vinculação / compilação de diretiva. Pode ser injetado em outras diretivas como meio de uso na comunicação entre diretivas.
Você deve especificar o nome da diretiva a ser requerida - ela deve estar vinculada ao mesmo elemento ou a seu pai. O nome pode ser prefixado com:
Use colchete
[‘directive1′, ‘directive2′, ‘directive3′]
para exigir várias controladoras de diretivas.fonte
Além disso, um bom motivo para usar uma função de controlador versus link (já que ambos têm acesso ao escopo, elemento e attrs) é porque você pode passar qualquer serviço ou dependência disponível para um controlador (e em qualquer ordem), enquanto você não pode fazer isso com a função de link. Observe as diferentes assinaturas:
vs.
fonte
module.directive('myDirective', function($window) { etc...
. Isso pode ser acessado de dentro da função de link.este é um bom exemplo para entender as fases da diretiva http://codepen.io/anon/pen/oXMdBQ?editors=101
html
fonte
link
,compile
econtroller
?require
diretiva d pode ser injetada no controlador de uma diretiva dependente?fonte