182 votes

Qu'est-ce qu'une directive angularjs ?

J'ai passé pas mal de temps à lire la documentation angularjs et plusieurs tutoriels, et j'ai été assez surpris de voir à quel point la documentation est inabordable.

J'ai une question simple, à laquelle il est possible de répondre, et qui peut également être utile à d'autres personnes cherchant à se familiariser avec angularjs :

Qu'est-ce qu'une directive angularjs ?

Il devrait y avoir une définition simple et précise d'une directive quelque part, mais la site web angularjs propose ces définitions étonnamment inutiles :

  • Sur la page d'accueil : Les directives sont une fonctionnalité unique et puissante disponible uniquement dans Angular. Les directives vous permettent d'inventer une nouvelle syntaxe HTML, spécifique à votre application.

  • Dans le documentation des développeurs : Les directives sont un moyen d'enseigner de nouveaux trucs à HTML. Pendant la compilation du DOM, les directives sont comparées au HTML et exécutées. Cela permet aux directives d'enregistrer un comportement, ou de transformer le DOM.

  • Il existe un série de discussions sur des directives qui, ironiquement, semblent supposer que le public comprend déjà de quoi il s'agit.

Quelqu'un serait-il en mesure de proposer, à titre de référence, une définition précise de ce qu'est une directive qui explique :

  1. Ce que c'est (voir le définition de jQuery à titre d'exemple)
  2. Quels sont les problèmes et les situations pratiques qu'il est censé résoudre ?
  3. Quel modèle de conception incarne-t-il, ou alternativement, comment s'intègre-t-il dans le prétendu modèle MVC/ MVW mission d'angularjs

Merci !

2 votes

Tu m'as eu à... voir la définition claire de jQuery à titre d'exemple.

0 votes

Je ne sais pas comment c'était en 2012 sur Stack Overflow, mais je viens de réviser cette question et d'ajouter la balise "angular-directive". Son informations sur les étiquettes donne en fait une définition assez claire. De plus, j'ai remarqué que je ne trouve pas la deuxième citation dans la documentation du développeur

143voto

Mark Rajcok Points 85912

Qu'est-ce que c'est (voir la définition claire de jQuery comme exemple) ?

Une directive est essentiellement une fonction † qui s'exécute lorsque le compilateur Angular le trouve dans le DOM. La ou les fonctions peuvent faire presque tout, c'est pourquoi je pense qu'il est assez difficile de définir ce qu'est une directive. Chaque directive a un nom (comme ng-repeat, tabs, make-your-own) et chaque directive détermine où elle peut être utilisée : élément, attribut, classe, dans un commentaire.

† Une directive n'a normalement qu'une fonction de (post)liaison. Une directive complexe peut avoir une fonction de compilation, une fonction de pré-liaison et une fonction de post-liaison.

Quels sont les problèmes et les situations pratiques qu'elle vise à résoudre ?

La chose la plus puissante que les directives puissent faire est d'étendre le HTML. Vos extensions sont Langage spécifique au domaine (DSL) pour construire votre application. Par exemple, si votre application gère un site d'achats en ligne, vous pouvez étendre le HTML pour avoir des directives "shopping-cart", "coupon", "specials", etc. - quels que soient les mots, objets ou concepts qui sont plus naturels à utiliser dans le domaine des "achats en ligne", plutôt que des "div "s et "span "s (comme @WTK l'a déjà mentionné).

Les directives permettent également de décomposer le HTML en composants, c'est-à-dire de regrouper un paquet de HTML en un composant réutilisable. Si vous vous retrouvez à utiliser ng-include pour regrouper beaucoup de HTML, il est probablement temps de passer aux directives.

Quel modèle de conception incarne-t-il, ou alternativement, comment s'inscrit-il dans la la prétendue mission MVC/MVW d'angularjs.

Les directives sont l'endroit où vous manipulez le DOM et attrapez les événements DOM. C'est pourquoi les fonctions compile et link de la directive reçoivent toutes deux "element" comme argument. Vous pouvez

  • définir un paquet de HTML (i.e., un modèle) pour remplacer la directive
  • lier des événements à cet élément (ou à ses enfants)
  • ajouter/supprimer une classe
  • changer la valeur de text()
  • surveiller les changements apportés aux attributs définis dans le même élément (en fait, ce sont les valeurs des attributs qui sont surveillées -- ce sont des propriétés de portée, d'où la directive surveille le "modèle" pour les changements)
  • etc.

En HTML, nous avons des choses comme <a href="..."> , <img src="..."> , <br> , <table><tr><th> . Comment décririez-vous ce que sont a, href, img, src, br, table, tr et th ? C'est ce qu'est une directive.

2 votes

Mark, merci. Je pense que cette réponse est claire et probablement la plus proche d'une réponse précise. Je pense que les directives sont toujours liées à des balises html, n'est-ce pas ? Il est donc peut-être plus exact de dire qu'une directive est une fonction liée à une balise HTML. En tant que telle, elle permet au langage HTML d'être étendu de manière déclarative.

0 votes

Eh bien, une directive peut être utilisée dans un commentaire, donc toutes les directives ne doivent pas être liées à une balise HTML. Par exemple, <!-- directive: my-directive exp -->

0 votes

Mark, serait-ce une utilisation non conventionnelle d'une directive ? Les directives sont conventionnellement utilisées et destinées à étendre le HTML.

11voto

jplozgom Points 1

Peut-être un simple et initial La définition des directives angulaires serait

Les directives AngularJS (ng-directives) sont des attributs HTML avec un préfixe ng (ng-model, ng-app, ng-repeat, ng-bind) utilisés par Angular pour étendre le HTML. ( de : W3schools angular tutorial )

Voici quelques exemples

Le site ng-app définit une application AngularJS.

Le site ng-model lie la valeur des contrôles HTML (input, select, textarea) aux données de l'application.

Le site ng-bind lie les données de l'application à la vue HTML.

<div ng-app="">
    <p>Name: <input type="text" ng-model="name"></p>
    <p ng-bind="name"></p>
</div>

Consultez ce tutoriel, du moins pour moi, c'est l'une des meilleures introductions à Angular. Une approche plus complète serait tout ce que @mark-rajcok a dit avant.

4voto

WTK Points 7883

En d'autres termes, il s'agit d'un modèle dans lequel vous utilisez un mélange de nodes arbitraires, de pseudo-javascript et de placeholders pour les données afin d'exprimer vos intentions sur la façon dont votre widget (composant) est structuré, comment il se comporte et comment il est alimenté en données. Angularjs s'exécute ensuite sur ces directives pour les traduire en code html/javascript fonctionnel.

Les directives sont là pour vous permettre de construire des composants plus complexes (widgets) en utilisant la sémantique appropriée. Il suffit de regarder l'exemple de directives d'angularjs - elles définissent le panneau d'onglets (qui n'est bien sûr pas valide en HTML normal). C'est plus intuitif que d'utiliser des div-s ou des spans pour créer une structure qui est ensuite stylisée en fonction de l'architecture de la page. ressembler à un volet d'onglets.

0 votes

J'ai ajouté ce qui me semble être une explication un peu moins technique.

1 votes

Merci, c'est très utile. Je peux donc peut-être le considérer comme une sorte de modèle dynamique (similaire à une classe en programmation O-O) qui encapsule un composant, le décrit par des propriétés et des comportements, est capable d'être instancié et peut s'exprimer dans le DOM ? Et la raison de son existence (par opposition à l'objet javascript ou au modèle html) est de permettre aux balises HTML d'adopter des comportements plus dynamiques, semblables à ceux des objets, afin qu'elles puissent commencer à être manipulables dans une programmation de type O-O ?

0 votes

Oui et non. Je ne dirais pas que la raison directives existe a beaucoup à voir avec le fait qu'ils sont manipulables dans la programmation OO. En fait, l'ensemble de l'approche angularjs du framework semble fortement liée au HTML et aux attributs arbitraires des nœuds du DOM plutôt qu'à l'écriture de code OO Javascript. J'ai cette impression en regardant tous les exemples de la façon dont angularjs résout les problèmes quotidiens. Je dirais que le la raison principale des directives est de disposer d'un moyen d'intégrer des comportements et des données dans un composant sémantiquement structuré.

3voto

Vivek Panday Points 848

Dans AngularJS, les directives sont des marqueurs html pour un élément DOM HTML, comme un attribut (restrict- A), un nom d'élément (restrict- E), un commentaire (restrict- M) ou une classe CSS (restrict - C), qui indiquent au compilateur HTML d'AngularJS ($compile) d'exécuter un comportement spécifique à cet élément DOM ou même de transformer l'élément DOM et ses enfants.

2voto

raam86 Points 3654

La page d'accueil est très claire à ce sujet : Lorsque vous survolez les onglets dans la dernière section :

Nous avons étendu le vocabulaire de HTML avec une fonction personnalisée tabs élément. Le site tabs fait abstraction de la structure HTML complexe et le comportement nécessaire au rendu des onglets. Le résultat est une vue plus plus lisible et une syntaxe très facilement réutilisable."

Puis dans l'onglet suivant :

angular.module('components', []).
  directive('tabs', function() {
    return {
      restrict: 'E',
      transclude: true,
      scope: {},
      controller: function($scope, $element) {
        var panes = $scope.panes = [];

        $scope.select = function(pane) {
          angular.forEach(panes, function(pane) {
            pane.selected = false;
          });
          pane.selected = true;
        }

Vous pouvez donc inventer des éléments html, par exemple tabs et laisser angular gérer le rendu de ces éléments.

2 votes

Merci pour cette réponse rapide ! Le but d'une directive est donc d'étendre le vocabulaire du HTML par la création de balises et d'attributs personnalisés ? Cela semble assez puissant, bien que cela semble répondre à un problème beaucoup plus large que "MVW". D'autres peuvent ne pas être d'accord, mais je pense que le fait de faire défiler une page jusqu'en bas, puis de survoler un mot hyperlié, et ensuite de lire une info-bulle qui ne mentionne pas une seule fois le mot "directive" n'est pas exactement une définition "très claire" de ce qu'est une directive. Néanmoins, j'apprécie vraiment la rapidité de la réponse.

0 votes

Oui ! Vous pouvez vérifier ce truc qu'ils ont fait. Le code html réel est différent de celui affiché dans le panneau html.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X