Je me demande s'il existe un moyen de passer un argument à une directive?
Ce que je veux faire, c'est ajouter une directive du contrôleur comme ceci:
$scope.title = "title";
$scope.title2 = "title2";
angular.element(document.getElementById('wrapper')).append('<directive_name></directive_name>');
Est-il possible de passer un argument en même temps pour que le contenu de mon modèle de directive puisse être lié à un domaine ou à un autre?
voici la directive:
app.directive("directive_name", function(){
return {
restrict:'E',
transclude:true,
template:'<div class="title"><h2>{{title}}</h3></div>',
replace:true
};
})
Et si je veux utiliser la même directive mais avec $ scope.title2?
Voici comment j'ai résolu mon problème:
Directive
app.directive("directive_name", function(){
return {
restrict: 'E',
transclude: true,
template: function(elem, attr){
return '<div><h2>{{'+attr.scope+'}}</h2></div>';
},
replace: true
};
})
Manette
$scope.building = function(data){
var chart = angular.element(document.createElement('directive_name'));
chart.attr('scope', data);
$compile(chart)($scope);
angular.element(document.getElementById('wrapper')).append(chart);
}
Je peux maintenant utiliser différentes portées à travers la même directive et les ajouter dynamiquement.
Vous pouvez passer des arguments à votre directive personnalisée comme vous le faites avec les directives angulaires intégrées - en spécifiant un attribut sur l'élément de directive:
angular.element(document.getElementById('wrapper'))
.append('<directive-name title="title2"></directive-name>');
Ce que vous devez faire, c'est définir la scope
(y compris le ou les arguments/paramètres) dans la fonction de fabrique de votre directive. Dans l'exemple ci-dessous, la directive prend un paramètre title
-. Vous pouvez ensuite l'utiliser, par exemple dans template
, en utilisant la méthode angulaire habituelle: {{title}}
app.directive('directiveName', function(){
return {
restrict:'E',
scope: {
title: '@'
},
template:'<div class="title"><h2>{{title}}</h2></div>'
};
});
Selon comment/ce que vous voulez lier, vous avez différentes options:
=
est une liaison bidirectionnelle@
lit simplement la valeur (liaison à sens unique)&
est utilisé pour lier des fonctionsDans certains cas, vous pouvez utiliser un nom "externe" différent du nom "interne". Avec external, j'entends le nom d'attribut sur l'élément directive et avec internal, le nom de la variable utilisée dans le champ d'application de la directive.
Par exemple, si nous regardons la directive ci-dessus, vous ne voudrez peut-être pas spécifier un autre attribut supplémentaire pour le titre, même si vous souhaitez en interne utiliser une propriété title
-. Au lieu de cela, vous souhaitez utiliser votre directive comme suit:
<directive-name="title2"></directive-name>
Cela peut être réalisé en spécifiant un nom derrière l'option mentionnée ci-dessus dans la définition de la portée:
scope: {
title: '@directiveName'
}
S'il vous plaît noter également les choses suivantes:
data-
. Angular le permet en supprimant le préfixe data-
- de tous les attributs. Ainsi, dans l'exemple ci-dessus, vous pouvez spécifier l'attribut sur l'élément (data-title="title2"
) et, en interne, tout serait identique.<div data-my-attribute="..." />
tandis que dans le code (par exemple, les propriétés sur l'objet de la portée), ils sont sous la forme de myAttribute
. J'ai perdu beaucoup de temps avant de m'en rendre compte.Vous pouvez essayer comme ci-dessous:
app.directive("directive_name", function(){
return {
restrict:'E',
transclude:true,
template:'<div class="title"><h2>{{title}}</h3></div>',
scope:{
accept:"="
},
replace:true
};
})
il établit une liaison bidirectionnelle entre la valeur de l'attribut 'accept' et la portée parente.
Et vous pouvez également définir une liaison de données bidirectionnelle avec la propriété: '='
Par exemple, si vous souhaitez que la clé et la valeur soient liées à la portée locale, procédez comme suit:
scope:{
key:'=',
value:'='
},
Pour plus d'informations, https://docs.angularjs.org/guide/directive
Donc, si vous voulez passer un argument du contrôleur à la directive, référez-vous à cela ci-dessous
http://jsfiddle.net/jaimem/y85Ft/7/
J'espère que ça aide..
<button my-directive="Push">Push to Go</button>
app.directive("myDirective", function() {
return {
restrict : "A",
link: function(scope, Elm, attrs) {
Elm.bind('click', function(event) {
alert("You pressed button: " + event.target.getAttribute('my-directive'));
});
}
};
});
voici ce que j'ai fait
J'utilise directive comme attribut html et j'ai passé le paramètre suivant dans mon fichier HTML. my-directive="Push"
Et de la directive je l'ai récupéré de l'objet événement clic-souris. event.target.getAttribute('my-directive')
.