Différences
Ci-dessous, les différences entre deux révisions de la page.
slam4:richclient:angularjs:directives [2015/01/06 14:04] – [Link/compile] jcheron | slam4:richclient:angularjs:directives [2019/08/31 14:21] (Version actuelle) – modification externe 127.0.0.1 | ||
---|---|---|---|
Ligne 44: | Ligne 44: | ||
|**[[https:// | |**[[https:// | ||
|**[[https:// | |**[[https:// | ||
- | |**[[https:// | + | |**[[https:// |
- | + | |**[[https://docs.angularjs.org/api/ng/directive/ngClass|ng-class]]** | | |
- | ng-click, ng-show, | + | |**[[https://docs.angularjs.org/api/ng/directive/ngSubmit|ng-submit]]** | |
- | ng-submit | + | |
- | + | ||
- | ===== Création de directives ===== | + | |
- | Quels intérêts ? | + | |
- | + | ||
- | | + | |
- | | + | |
- | + | ||
- | + | ||
- | ==== Directive simple & template ==== | + | |
- | + | ||
- | <sxh javascript; | + | |
- | var app = angular.module(' | + | |
- | .controller(' | + | |
- | $scope.client = { | + | |
- | nom: ' | + | |
- | prenom: ' | + | |
- | }; | + | |
- | }]); | + | |
- | + | ||
- | app.directive(' | + | |
- | return { | + | |
- | template: 'Nom : {{client.nom}} Prénom : {{client.prenom}}' | + | |
- | }; | + | |
- | }); | + | |
- | </sxh> | + | |
- | + | ||
- | **Utilisations possibles :** | + | |
- | + | ||
- | <sxh html; | + | |
- | <html data-ng-app=" | + | |
- | ... | + | |
- | < | + | |
- | <div my-client></ | + | |
- | </ | + | |
- | + | ||
- | **Résultat :** | + | |
- | + | ||
- | {{: | + | |
- | + | ||
- | ==== templateUrl ==== | + | |
- | Excepté pour les petits templates, il est préférable d' | + | |
- | <sxh javascript; | + | |
- | app.directive(' | + | |
- | return { | + | |
- | templateUrl: | + | |
- | }; | + | |
- | }); | + | |
- | </sxh> | + | |
- | + | ||
- | <sxh html; | + | |
- | Nom : {{client.nom}} Prénom : {{client.prenom}} | + | |
- | </sxh> | + | |
- | + | ||
- | La propriété templateUrl peut-être définie par une fonction : | + | |
- | + | ||
- | <sxh javascript; | + | |
- | app.directive(' | + | |
- | return { | + | |
- | templateUrl: | + | |
- | return ' | + | |
- | } | + | |
- | }; | + | |
- | }); | + | |
- | </sxh> | + | |
- | + | ||
- | **Templates :** | + | |
- | <sxh html; | + | |
- | Nom : {{client.nom}} Prénom : {{client.prenom}} | + | |
- | </ | + | |
- | + | ||
- | <sxh html; | + | |
- | Adresse: {{client.adresse}}< | + | |
- | CP: {{client.cp}} {{client.ville}} | + | |
- | </ | + | |
- | + | ||
- | **Utilisation :** | + | |
- | <sxh html; | + | |
- | <html data-ng-app=" | + | |
- | ... | + | |
- | <div myclient type=" | + | |
- | <div my-client type=" | + | |
- | </ | + | |
- | ==== restrict ==== | + | |
- | La propriété | + | |
- | * éléments - **E** | + | |
- | * attributs - **A** | + | |
- | * classe Css - **C** | + | |
- | * commentaire - **M** | + | |
- | * ou une combinaison de ces valeurs : **EA** par exemple, pour élément et attribut | + | |
- | + | ||
- | Si la directive est définie sur 1 élément : | + | |
- | < | + | |
- | app.directive(' | + | |
- | return { | + | |
- | restrict: ' | + | |
- | templateUrl: | + | |
- | return ' | + | |
- | } | + | |
- | }; | + | |
- | }); | + | |
- | </ | + | |
- | + | ||
- | Seule la première ligne sera compilée par Angular, la seconde sera ignorée | + | |
- | <sxh html; | + | |
- | <html data-ng-app="testDirectivesApp" | + | |
- | ... | + | |
- | < | + | |
- | <div my-client type=" | + | |
- | </ | + | |
- | + | ||
- | ==== scope ==== | + | |
- | Le scope défini la portée d'une directive. Sans précision, le scope d'une directive est le scope de son contrôleur parent. Ce qui explique que notre directive ait pu accéder à la variable **client** | + | |
- | + | ||
- | === Isolation === | + | |
- | La directive précédemment créée a un défaut : elle dépend du contrôleur dans laquelle elle a été définie, et si nous souhaitons afficher un autre client, il faut définir un autre contrôleur...\\ | + | |
- | La définition de la variable scope de la directive permet de résoudre ce problème : | + | |
- | + | ||
- | + | ||
- | **scope:{}** | + | |
- | Défini à {}, la directive a un scope qui lui est propre, différent de celui du controller auquel elle appartient : | + | |
- | <sxh javascript; | + | |
- | app.directive(' | + | |
- | return { | + | |
- | restrict: ' | + | |
- | scope:{}, | + | |
- | templateUrl: | + | |
- | return ' | + | |
- | } | + | |
- | }; | + | |
- | }); | + | |
- | </sxh> | + | |
- | + | ||
- | Avec ce scope isolé, la directive ne peut plus accéder à la variable client définie dans le scope du controller : tester la page tests.html | + | |
- | + | ||
- | Nous allons ajouter une propriété permettant d' | + | |
- | + | ||
- | <sxh html; | + | |
- | <html data-ng-app=" | + | |
- | ... | + | |
- | < | + | |
- | < | + | |
- | </sxh> | + | |
- | + | ||
- | <sxh javascript; | + | |
- | app.directive(' | + | |
- | return{ | + | |
- | restrict:' | + | |
- | scope: | + | |
- | templateUrl: | + | |
- | return ' | + | |
- | } | + | |
- | } | + | |
- | }); | + | |
- | </sxh> | + | |
- | + | ||
- | L' | + | |
- | + | ||
- | Lorsqu' | + | |
- | <sxh javascript; | + | |
- | scope : {attributeName: | + | |
- | </ | + | |
- | + | ||
- | Pour résumer (rapidement...) : | + | |
- | + | ||
- | ^Valeurs de scope ^Résultats ^ | + | |
- | | false ou non définie | + | |
- | | {} | scope isolé | | + | |
- | | {attributeName:" | + | |
- | | {attributeNameInDirectiveScope:" | + | |
- | | {attributeName:" | + | |
- | | {attributeNameInDirectiveScope:" | + | |
- | | {attributeName:"&" | + | |
- | | {attributeNameInDirectiveScope:"& | + | |
- | | true | scope non isolé | | + | |
- | + | ||
- | **Exemple de passage d'une expression action (ng-click) :** | + | |
- | <sxh html;title:tests.html> | + | |
- | <my-client type=" | + | |
- | <div my-client type=" | + | |
- | </ | + | |
- | + | ||
- | Sur click du nom, l' | + | |
- | + | ||
- | En l' | + | |
- | <sxh javascript; | + | |
- | app.directive(' | + | |
- | return{ | + | |
- | restrict:' | + | |
- | scope: | + | |
- | templateUrl: | + | |
- | return ' | + | |
- | } | + | |
- | } | + | |
- | }); | + | |
- | </sxh> | + | |
- | + | ||
- | et la déclencher à nouveau dans le template : | + | |
- | <sxh html; | + | |
- | <p ng-click=" | + | |
- | </ | + | |
- | + | ||
- | ==== Link/ | + | |
- | + | ||
- | Lorsqu' | + | |
- | - compile | + | |
- | - controller | + | |
- | - pre-link | + | |
- | - post-link | + | |
- | Si une directive doit modifier ou créer | + | |
- | + | ||
- | === Exemple === | + | |
- | + | ||
- | <sxh javascript; | + | |
- | app.directive(' | + | |
- | return { | + | |
- | restrict : ' | + | |
- | scope: | + | |
- | compile : function(tElem, | + | |
- | if (tAttrs.bold == " | + | |
- | tElem.css(" | + | |
- | else | + | |
- | tElem.css(" | + | |
- | var linkFunction = function($scope, | + | |
- | var update=function(){ | + | |
- | if($scope.montant< | + | |
- | tElem.html(" | + | |
- | tElem.css(" | + | |
- | }else{ | + | |
- | tElem.html($scope.montant); | + | |
- | tElem.css(" | + | |
- | } | + | |
- | } | + | |
- | update(); | + | |
- | $scope.$watch(' | + | |
- | update(); | + | |
- | }); | + | |
- | } | + | |
- | return linkFunction; | + | |
- | } | + | |
- | } | + | |
- | }); | + | |
- | </ | + |