Preciso executar algumas operações no escopo e no modelo. Parece que eu posso fazer isso na link
função ou na controller
função (já que ambos têm acesso ao escopo).
Quando é que eu tenho que usar a link
função e não o controlador?
angular.module('myApp').directive('abc', function($timeout) {
return {
restrict: 'EA',
replace: true,
transclude: true,
scope: true,
link: function(scope, elem, attr) { /* link function */ },
controller: function($scope, $element) { /* controller function */ }
};
}
Além disso, eu entendo que link
é o mundo não angular. Então, eu posso usar $watch
, $digest
e $apply
.
Qual é o significado da link
função, quando já tínhamos controlador?
javascript
angularjs
angularjs-directive
Yugal Jindle
fonte
fonte
$watch
,$digest
e$apply
. "?link
, não vemos nenhuma mágica angular. ou seja, sem ligações bidirecionais, etc. Só que temos a API do angular disponível para uso.Respostas:
Depois da minha primeira luta com o
link
econtroller
funções e ler muito sobre eles, acho que agora eu tenho a resposta.Primeiro vamos entender ,
Como as diretivas angulares funcionam em poucas palavras:
Começamos com um modelo (como uma string ou carregado em uma string)
var templateString = '<div my-directive>{{5 + 10}}</div>';
Agora, isso
templateString
é envolvido como um elemento angularvar el = angular.element(templateString);
Com
el
, agora compilamos$compile
para recuperar a função de link .var l = $compile(el)
Aqui está o que acontece,
$compile
percorre todo o modelo e coleta todas as diretivas que ele reconhece.link
funções são coletadas.link
funções são agrupadas em uma novalink
função e retornadas comol
.Finalmente, fornecemos
scope
função para essa funçãol
(link) que executa ainda mais as funções de link agrupadas com essescope
e seus elementos correspondentes.l(scope)
Isso adiciona o
template
como um novo nó aoDOM
e chama,controller
adicionando seus relógios ao escopo que é compartilhado com o modelo no DOM.Comparando compilação vs link x controlador :
Toda diretiva é compilada apenas uma vez e a função de link é mantida para reutilização. Portanto, se houver algo aplicável a todas as instâncias de uma diretiva, ele deverá ser executado dentro da
compile
função da diretiva .Agora, após a compilação, temos a
link
função que é executada ao anexar o modelo ao DOM . Portanto, executamos tudo o que é específico a cada instância da diretiva. Por exemplo: anexando eventos , alterando o modelo com base no escopo , etc.Finalmente, o controlador deve estar disponível para ser ativo e reativo enquanto a diretiva trabalha no
DOM
(depois de se conectar). Portanto:(1) Após configurar a visualização [ V ] (isto é, modelo) com o link.
$scope
é nosso [ M ] e$controller
é nosso [ C ] no MVC(2) Aproveite a ligação bidirecional com $ scope , configurando relógios.
(3)
$scope
espera-se que os relógios sejam adicionados ao controlador, pois é isso que está observando o modelo durante o tempo de execução.(4) Finalmente,
controller
também é usado para poder se comunicar entre diretivas relacionadas. (ComomyTabs
exemplo em https://docs.angularjs.org/guide/directive )(5) É verdade que também poderíamos ter feito tudo isso na
link
função, mas é sobre a separação de preocupações .Portanto, finalmente, temos o seguinte que se encaixa perfeitamente em todas as peças:
fonte
Por que os controladores são necessários
A diferença entre
link
econtroller
entra em jogo quando você deseja aninhar diretivas no seu DOM e expor as funções da API da diretiva pai para as aninhadas.Dos documentos :
Digamos que você queira ter duas diretivas
my-form
emy-text-input
que amy-text-input
diretiva apareça apenas dentromy-form
e em nenhum outro lugar.Nesse caso, você vai dizer ao definir a diretiva
my-text-input
que requer um controlador doparent
elemento DOM usando o argumento requer, como este:require: '^myForm'
. Agora, o controlador do elemento pai entraráinjected
nalink
função como o quarto argumento a seguir$scope, element, attributes
. Você pode chamar funções nesse controlador e se comunicar com a diretiva pai.Além disso, se esse controlador não for encontrado, um erro será gerado.
Por que usar o link
Não há necessidade real de usar a
link
função se alguém estiver definindo o,controller
pois o$scope
está disponível nocontroller
. Além disso, ao definir amboslink
econtroller
, é preciso ter cuidado com a ordem de invocação dos dois (controller
é executada antes).No entanto, de acordo com a maneira Angular , a maioria das manipulações DOM e ligações bidirecionais
$watchers
geralmente é feita nalink
função, enquanto a API para filhos e$scope
manipulação é feita nacontroller
. Esta não é uma regra rígida e rápida, mas isso tornará o código mais modular e ajudará na separação de preocupações (o controlador manterá odirective
estado e alink
função manterá asDOM
ligações + externas).fonte
link
?controller
? Por que vou querer inventar uma função totalmente nova apenas para evitar a definição de controlador?A
controller
função / objeto representa um MVC (Model-View-Controller) da abstração. Embora não haja nada novo para escrever sobre o MVC, ainda é a vantagem mais significativa do angular: divida as preocupações em pedaços menores. E é isso, nada mais, por isso, se você precisa para reagir aModel
mudanças provenientes deView
oController
é o direito pessoa para fazer esse trabalho.A história sobre a
link
função é diferente, vem de uma perspectiva diferente da MVC. E é realmente essencial, uma vez que queremos cruzar os limites de umcontroller/model/view
(modelo) .Vamos começar com os parâmetros que são passados para a
link
função:Para colocar o
link
contexto, devemos mencionar que todas as diretivas estão passando por essas etapas do processo de inicialização: Compilar , Vincular . Um extrato do livro de Brad Green e Shyam Seshadri Angular JS :Fase de compilação (uma irmã do link, vamos mencionar aqui para obter uma imagem clara):
Nesta fase, o Angular percorre o DOM para identificar todas as diretivas registradas no modelo. Para cada diretiva, ele transforma o DOM com base nas regras da diretiva (modelo, substitui, transclui e assim por diante) e chama a função de compilação, se existir. O resultado é uma função de modelo compilada,
Fase de ligação :
Um bom exemplo de como usar o
link
pode ser encontrado aqui: Criando diretivas personalizadas . Veja o exemplo: Criando uma diretiva que manipula o DOM , que insere uma "data e hora" na página, atualizada a cada segundo.Apenas um pequeno trecho dessa fonte rica acima, mostrando a verdadeira manipulação com o DOM. Há uma função conectada ao serviço $ timeout e também é limpa em sua chamada de destruidor para evitar vazamentos de memória
fonte
compiler
elink
. Eles questão está pedindo por isso quelink
quando já tínhamoscontroller
controller
vslink
devem ser mais claros ...link
ou para ocontroller
.controller
elink
é relativamente feio. Portanto, a equipe angular deve ter uma boa razão para isso, em vez de apenas uma opção.