Directivas angulares: enlace al controlador sin servicios.
-
20-12-2019 - |
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?
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.