Vues vs composants dans Ember.js

143

J'apprends ember.js et j'essaye de comprendre la différence entre une vue et un composant. Je vois les deux comme un moyen de fabriquer des composants réutilisables.

Du site Web d'Ember sur les vues:

Les vues dans Ember.js ne sont généralement créées que pour les raisons suivantes:
-Lorsque vous avez besoin d'une gestion sophistiquée des événements utilisateur
-Lorsque vous souhaitez créer un composant réutilisable

Sur le site Web d'Ember sur les composants:

Un composant est une balise HTML personnalisée dont vous implémentez le comportement à l'aide de JavaScript et dont vous décrivez l'apparence à l'aide des modèles Handlebars. Ils vous permettent de créer des contrôles réutilisables qui peuvent simplifier les modèles de votre application.

Alors, quelle est la principale différence entre une vue et un composant? Et quel serait un exemple courant où je préférerais utiliser une vue sur un composant et vice versa?

Bradley Trager
la source

Réponses:

170

Ember.View

Un Ember.View est actuellement limité aux balises créées pour vous par le W3C. Mais si vous vouliez définir vos propres balises HTML spécifiques à l'application, puis implémenter leur comportement à l'aide de JavaScript? Vous ne pouvez pas faire cela avec un Ember.View .

Ember.Component

C'est exactement ce que les composants vous permettent de faire. En fait, c'est une si bonne idée que le W3C travaille actuellement sur la spécification des éléments personnalisés .

L'implémentation des composants par Ember essaie d'être aussi proche que possible des spécifications des composants Web. Une fois que les éléments personnalisés sont largement disponibles dans les navigateurs, vous devriez être en mesure de migrer facilement vos composants Ember vers la norme W3C et de les rendre utilisables par d'autres frameworks qui ont adopté la nouvelle norme.

C'est si important pour nous que nous travaillons en étroite collaboration avec les organismes de normalisation pour garantir que notre mise en œuvre des composants correspond à la feuille de route de la plate-forme Web.

Il est également important de noter qu'un Ember.Component est en fait un Ember.View (une sous-classe) mais qui est complètement isolé . L'accès aux propriétés dans ses modèles va à l' objet de vue et les actions sont également ciblées sur l' objet de vue . Il n'y a pas d'accès aux informations contextuelles environnantes contextou extérieures , ce qui n'est pas le cas avec un Ember.View qui a effectivement accès à son contrôleur environnant, par exemple à l'intérieur d'une vue, vous pourriez faire quelque chose comme qui vous donnerait le contrôleur actuellement associé à la vue.controller this.get('controller')

Alors, quelle est la principale différence entre une vue et un composant?

Ainsi, la principale différence en plus du fait que les composants vous permettent de créer vos propres balises et à un moment donné dans le futur, lorsque les éléments personnalisés sont disponibles, migre / utilise également ces composants dans d'autres frameworks qui prendront en charge les éléments personnalisés, est en effet qu'à un moment donné, un composant de braise rendra une vue quelque peu obsolète en fonction du cas d'implémentation spécifique.

Et quel serait un exemple courant où je préférerais utiliser une vue sur un composant et vice versa?

Suite à ce qui précède, cela dépend clairement de vos cas d'utilisation. Mais en règle générale, si vous avez besoin dans votre vue, d'accéder à son contrôleur environnant, etc., utilisez un Ember.View , mais si vous souhaitez isoler la vue et ne transmettre que les informations dont elle a besoin pour fonctionner, ce qui la rend indépendante du contexte et bien plus réutilisable, utilisez un Ember.Component .

J'espère que ça aide.

Mettre à jour

Avec la publication de Road to Ember 2.0, vous êtes maintenant encouragé à utiliser des composants plutôt que des vues dans la plupart des cas.

pixel intuitif
la source
1
Ma seule préoccupation concernant les composants est lorsqu'ils deviennent complexes. Je ne sais pas encore comment séparer la partie logique de la partie rendu. J'ai des vues régulières, vous avez cette séparation et vous pourriez mettre la logique dans le contrôleur, mais avec le composant, j'ai tendance à dire que vous finirez par avoir un désordre très complexe et peut-être énorme. Savez-vous s'il est possible de définir un contrôleur dédié pour les composants? Ou peut-être que les composants ne sont tout simplement pas destinés à gérer des éléments graphiques complexes.
sly7_7
3
@ sly7_7, oui je comprends votre point. Mais je penserais à un composant comme une boîte noire, ne se comportant que sur la base des données dans lesquelles il est transmis. Et oui, selon ce qu'il fait, cela pourrait devenir un gâchis très rapidement. Un contrôleur dédié aurait un sens absolu, et cela pourrait fonctionner si les composants pouvaient devenir logiques injectés dedans, mais pour autant que je sache, les composants ne font pas partie du conteneur de braise de par leur conception, je suppose, mais cela pourrait changer à l'avenir pour résoudre exactement quelque chose comme ça. Bon point quand même!
intuitifpixel
2
des liaisons peuvent-elles sortir d'un composant? IE, avec la forme de bloc d'un composant, les éléments de contenu du bloc peuvent-ils se lier aux propriétés du composant, ou dois-je utiliser une vue dans ce cas?
Michael Johnston
2
ah, oui ils peuvent. {{view.xxxx}}fonctionne dans un composant de la même manière que dans une vue.
Michael Johnston
Commentaires de Tom Dale sur ce sujet: ember.zone/the-confusion-around-ember-views-and-components/…
Akshay Rawat
17

La réponse est simple: utiliser des composants

Selon une vidéo de formation enregistrée en août 2013, Yehuda Kats et Tom Dale (membres de l'équipe Ember Core) ont dit au public de ne pas utiliser de vues à moins que vous ne soyez un développeur de framework. Ils ont apporté de nombreuses améliorations aux guidons et introduit des composants, de sorte que les vues ne sont plus nécessaires. Les vues sont utilisées en interne pour alimenter des éléments tels que {{#if}} et {{outlet}}.

Les composants imitent également étroitement la norme Web Component qui sera intégrée au navigateur, il y a donc de nombreux avantages secondaires à devenir à l'aise dans la construction de composants Ember.

Mise à jour 27/11/2014

Il est encore plus important maintenant d'utiliser des composants au lieu de vues, car Ember 2.0 utilisera des composants routables lorsqu'une route est entrée, au lieu d'un contrôleur / vue. Afin de pérenniser votre application, il est préférable de rester à l'écart de Views.

Sources:

Johnny Oshika
la source
5
"Si vous pensez avoir besoin d'utiliser une vue, utilisez plutôt un composant." est un conseil terrible, et trahit un manque de compréhension de l'isolement que les composants impliquent.
jmcd
@jmcd, bien que ce commentaire vienne des développeurs du framework eux-mêmes, je l'ai supprimé.
Johnny Oshika
2
J'ai trouvé la source: formation vidéo Gaslight, vidéo 10.3 Q&R composants @ 26m mark. Tom dit: «Depuis que ces exemples ont été écrits, ... nous avons ajouté des composants [qui] n'existaient pas lorsque ces exemples ont été écrits. En général, je dirais que les vues ne sont pas quelque chose que nous attendons de la plupart des développeurs, mais plutôt un objet de comptabilité interne à ce stade ''
jmcd
2
@jmcd, Dans cette vidéo @ 26:15, Tom dit "essentiellement n'utilise pas de vues". De plus, si vous sautez à 30m dans la même vidéo, Yehuda Katz dit: "La vue est essentiellement un détail d'implémentation interne ... vous pouvez utiliser une vue, mais vous êtes alors un développeur de framework. Vous devriez plutôt utiliser l'une des choses que nous avons construit pour vous qui utilise View, et celui qui est le plus proche de View mais qui a une meilleure sémantique est Component. Tout ce que vous auriez pu utiliser un View pour avant, Component est très bien. "
Johnny Oshika
5

En l'état actuel - v2.xétant la version stable actuelle - les vues ont été complètement obsolètes. On dit que les vues sont supprimées de l'API Ember 2.0 .

Ainsi, l'utilisation du {{view}}mot-clé dans Ember 2.0 déclenchera une assertion:

Échec de l'assertion: l'utilisation {{view}}ou tout chemin basé sur celui-ci a été supprimé dans Ember 2.0

Si vous devez utiliser des vues dans Ember 2.0, vous pouvez utiliser l' addon ember-legacy-views , qui sera compatible avec Ember jusqu'à la version 2.4 .

Donc, pour résumer - les composants sont le présent (les vues étant supprimées) et l'avenir - ils remplaceront également les contrôleurs. Voir RFC sur les composants routables .

Daniel Kmak
la source