Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
richclient:emberjs:components [2018/01/26 02:46] – [Passage de paramètres à un composant] jcheron | richclient:emberjs:components [2019/08/31 14:21] (Version actuelle) – modification externe 127.0.0.1 | ||
---|---|---|---|
Ligne 27: | Ligne 27: | ||
<sxh html; | <sxh html; | ||
{{#each model as |post|}} | {{#each model as |post|}} | ||
- | {{blog-post title=post.title}} | + | {{#blog-post title=post.title}} |
{{post.body}} | {{post.body}} | ||
{{/ | {{/ | ||
Ligne 111: | Ligne 111: | ||
{{/each}} | {{/each}} | ||
</ | </ | ||
+ | |||
+ | ===== Contenu ===== | ||
+ | Un composant peut disposer d'un contenu passé entre ses balises ouvrante et fermante : | ||
+ | |||
+ | L' | ||
+ | <sxh html; | ||
+ | {{# | ||
+ | <p class=" | ||
+ | {{body}} | ||
+ | {{/ | ||
+ | </ | ||
+ | |||
+ | Le template correspondant insère le contenu passé entre les balise grâce au helper **yield** | ||
+ | <sxh html; | ||
+ | < | ||
+ | <div class=" | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Personnalisation des éléments HTML ===== | ||
+ | |||
+ | ==== Balise principale ==== | ||
+ | |||
+ | Par défaut le code HTML généré par un composant l'est dans une **div**. | ||
+ | <sxh html; | ||
+ | <div id=" | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Il suffit de modifier la propriété **tagName** du composant dans la classe dérivée associée pour modifier cette balise par défaut : | ||
+ | <sxh javascript; | ||
+ | import Component from ' | ||
+ | |||
+ | export default Component.extend({ | ||
+ | tagName: ' | ||
+ | }); | ||
+ | </ | ||
+ | |||
+ | <sxh html; | ||
+ | <ul> | ||
+ | < | ||
+ | < | ||
+ | </ul> | ||
+ | </ | ||
+ | |||
+ | ==== Personnalisation de la classe css ==== | ||
+ | |||
+ | La classe appliquée au composant qui sera généré peut être définie à son invocation, en tant qu' | ||
+ | |||
+ | <sxh html> | ||
+ | {{navigation-bar class=" | ||
+ | </ | ||
+ | |||
+ | Il est également possible de déterminer quelle classe css sera appliquée à un composant en affectant à sa propriété **classNames** un tableau de strings. | ||
+ | |||
+ | <sxh javascript> | ||
+ | import Component from ' | ||
+ | |||
+ | export default Component.extend({ | ||
+ | classNames: [' | ||
+ | }); | ||
+ | </ | ||
+ | |||
+ | Il est également possible de déterminer la classe css à partir des propriétés du composant en utilisant **classNameBindings**. | ||
+ | |||
+ | Si une propriété booléenne est utilisée, la classe sera présente ou absente en fonction de la valeur de la propriété (false ou true) : | ||
+ | |||
+ | |||
+ | <sxh javascript> | ||
+ | import Component from ' | ||
+ | |||
+ | export default Component.extend({ | ||
+ | classNameBindings: | ||
+ | isUrgent: true | ||
+ | }); | ||
+ | </ | ||
+ | |||
+ | **classNameBindings** peut également porter une condition (si/ | ||
+ | <sxh javascript> | ||
+ | import Component from ' | ||
+ | |||
+ | export default Component.extend({ | ||
+ | classNameBindings: | ||
+ | isEnabled: false | ||
+ | }); | ||
+ | </ | ||
+ | |||
+ | ==== Personnalisation des attributs HTML ==== | ||
+ | |||
+ | La propriété **attributeBindings** permet de définir les attributs du DOM associés au HTML généré : | ||
+ | <sxh javascript> | ||
+ | import Component from ' | ||
+ | |||
+ | export default Component.extend({ | ||
+ | tagName: ' | ||
+ | attributeBindings: | ||
+ | |||
+ | href: ' | ||
+ | }); | ||
+ | </ | ||
+ | |||
+ | Il est possible de définir **attributeBindings** à partir d'une propriété du composant : | ||
+ | <sxh javascript> | ||
+ | import Component from ' | ||
+ | |||
+ | export default Component.extend({ | ||
+ | tagName: ' | ||
+ | attributeBindings: | ||
+ | |||
+ | customHref: ' | ||
+ | }); | ||
+ | </ | ||
+ | |||
+ | ===== Gestion des événements ===== | ||
+ | |||
+ | |||
+ | <sxh html; | ||
+ | {{# | ||
+ | This is a double clickable area! | ||
+ | {{/ | ||
+ | </ | ||
+ | |||
+ | |||
+ | Ajout de la prise en charge de l' | ||
+ | <sxh javascript; | ||
+ | import Component from ' | ||
+ | |||
+ | export default Component.extend({ | ||
+ | doubleClick() { | ||
+ | alert(" | ||
+ | } | ||
+ | }); | ||
+ | </ | ||
+ | |||
+ | |||
+ | Pour autoriser la propagation de l' | ||
+ | <sxh javascript; | ||
+ | import Component from ' | ||
+ | |||
+ | export default Component.extend({ | ||
+ | doubleClick() { | ||
+ | alert(" | ||
+ | return true; | ||
+ | } | ||
+ | }); | ||
+ | </ | ||
+ | |||
+ | Voir la liste des [[https:// | ||
+ | |||
+ | ===== Actions ===== | ||
+ | |||
+ | Création d'un composant appelant l' | ||
+ | |||
+ | Générer le composant : | ||
+ | |||
+ | <sxh bash; | ||
+ | ember generate component action-button | ||
+ | </ | ||
+ | |||
+ | |||
+ | Implémenter le template du composant **action-button** : | ||
+ | |||
+ | <sxh html; | ||
+ | <button {{action " | ||
+ | </ | ||
+ | |||
+ | Le template invoque l' | ||
+ | |||
+ | <sxh javascript; | ||
+ | import Ember from ' | ||
+ | |||
+ | export default Ember.Component.extend({ | ||
+ | actions: { | ||
+ | doButtonThing() { | ||
+ | this.sendAction(' | ||
+ | } | ||
+ | } | ||
+ | }); | ||
+ | </ | ||
+ | |||
+ | |||
+ | Le composant peut maintenant être utilisé dans une route /test : | ||
+ | |||
+ | <sxh html; | ||
+ | {{# | ||
+ | </ | ||
+ | |||
+ | |||
+ | l' | ||
+ | |||
+ | <sxh javascript; | ||
+ | import Route from ' | ||
+ | |||
+ | export default Route.extend({ | ||
+ | actions: { | ||
+ | continue() { | ||
+ | console.log(" | ||
+ | this.replaceWith(' | ||
+ | } | ||
+ | } | ||
+ | }); | ||
+ | </ | ||
+ | |||
+ | |||
+ |