Direttive angolari: collegamento al controller senza servizi
-
20-12-2019 - |
Domanda
Sto gradualmente ottenendo la sospensione delle direttive angolari e finora, hanno fatto ricorso a creare un servizio come intermediario tra i controller.
Mi stavo solo chiedendo, nel contesto delle direttive (e le funzioni di collegamento) è possibile dare al controller l'accesso alle variabili dalla funzione di collegamento?(Senza un servizio o variabili globali).
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');
});
}
}
};
.
Voglio che il valore dell'attributo name della collezione sia disponibile all'interno del mio controller, in modo da poter apportare le chiamate socket appropriate.Qualche idea?
Soluzione
condividono lo stesso ambito, quindi questo dovrebbe funzionare.
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');
});
}
}
};
. Altri suggerimenti
È possibile aggiungere un metodo sul controller e la chiamata dalla funzione di collegamento.
controller: function($scope, socket) {
this.setSocket = function(name){
{...}
}
}
.
On Link:
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.