Diretivas Angulares:Link para Controlador sem Serviços
-
20-12-2019 - |
Pergunta
Aos poucos estou pegando o jeito das diretivas Angular e, até agora, recorri à criação de um serviço como intermediário entre os controladores.
Eu estava pensando, no contexto de diretivas (e funções de vinculação), é possível dar ao controlador acesso a variáveis da função de vinculação?(Sem serviço ou variáveis globais).
module.exports = function() {
return {
restrict: 'A',
templateUrl: 'partials/collection',
link: function(scope, element, attrs) {
var name = attrs.collectionName;
// from here
},
controller: function($scope, socket) {
$scope.models = [];
// to here
socket.on('ready', function() {
socket.emit(name + '/get');
});
}
}
};
Quero que o valor do atributo nome da coleção esteja disponível em meu controlador, para que eu possa fazer chamadas de soquete apropriadas.Qualquer ideia?
Solução
Eles compartilham o mesmo escopo, então isso deve funcionar.
module.exports = function() {
return {
restrict: 'A',
templateUrl: 'partials/collection',
link: function(scope, element, attrs) {
scope.name = attrs.collectionName;
// from here
},
controller: function($scope, socket) {
$scope.models = [];
// to here
socket.on('ready', function() {
socket.emit($scope.name + '/get');
});
}
}
};
Outras dicas
Você pode adicionar um método no controlador e chamá-lo a partir da função de link.
controller: function($scope, socket) {
this.setSocket = function(name){
{...}
}
}
No link:
link: function(scope, element, attrs, controller){
var name = attrs.collectionName;
controller.setSocket(name);
}
Existem algumas maneiras de fazer o que você deseja
Basta colocar tudo na função link.Você pode definir funções e variáveis no escopo da mesma forma que faria em um controlador.
Basta colocar tudo no controlador, em termos de configuração de variáveis ou funções de escopo.É injetado com
$attrs
, que contém os valores de atributos normalizados, para que você tenha acesso aos atributos se precisar deles.
Até onde eu sei, na maioria dos casos não faz diferença onde você atribui variáveis ou funções no escopo.A principal diferença entre os dois é que se você quiser dar à sua diretiva uma API pública, para que outras diretivas possam se comunicar com ela via require
, então você deve usar this.something
no controlador.
Talvez haja uma maneira melhor de fazer isso, mas consegui contornar o problema alterando as dependências das funções do meu controlador para incluir um argumento $element.Depois usei apenas o jqLite para obter o valor do atributo em questão.
controller: function($scope, $element, socket) {
var name = $element.attr('collection-name');
}
Não é fantasticamente elegante, mas funciona.