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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top