Pregunta

Hace hasta ahora, he recurrido a la creación de un servicio como un intermediario entre los controladores.

Me estaba preguntando, en el contexto de las directivas (y las funciones de vinculación) ¿Es posible dar el acceso al controlador a las variables de la función de enlace?(Sin servicio o variables globales).

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');
        });

      }
    }  
  };

Quiero que el valor del atributo de la recopilación esté disponible dentro de mi controlador, para que pueda realizar llamadas de toma apropiadas.¿Alguna idea?

¿Fue útil?

Solución

Comparten el mismo alcance, por lo que esto debería 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');
        });

      }
    }  
  };

Otros consejos

Puede agregar un método en el controlador y llamarlo desde la función de enlace.

controller: function($scope, socket) {
   this.setSocket = function(name){
       {...}
   }
}

en el enlace:

link: function(scope, element, attrs, controller){
    var name = attrs.collectionName; 
    controller.setSocket(name);
}

There are a couple of ways of doing what you want

  • Just put everything in the link function. You can set functions and variables on the scope just like you might put in a controller.

  • Just put everything in the controller, in terms of setting scope variables or functions. It is injected with $attrs, which contains the normalised attribute values, so you have access to the attributes if you need them.

As far as I know, in most cases it doesn't make a difference where you assign variables or functions on the scope. The main difference between the two is that if you want to give your directive a public API, so other directives can communicate to it via require, then you must use this.something in the controller.

There maybe a better way to do it, but I've managed to get around the problem by changing my controller functions dependencies to include an $element argument. Then just used jqLite to get the value of the attribute in question.

controller: function($scope, $element, socket) {
   var name = $element.attr('collection-name');
}

It's not fantastically elegant, but it works.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top