Backbone.js: imbrication des vues à travers les templates
Est-il techniquement possible d'imbriquer des points de vue, à l'aide de gabarits, de quelque chose comme ça:
<%= new PhotoCollectionView({model:new PhotoCollection(model.similarPhotos)}).render().el) %>
Je peux mettre tous les trucs dans la méthode render, mais templating donne beaucoup plus de place à la souplesse et à la mise en page.
J'ai essayé de ladite variante, mais tout ce que j'obtiens comme résultat sur l'écran est [HTMLDivElement]
.
Si j'essaie d'extraire juste le HTML sur ouf, à l'aide de jQuery HTML, je l'ai rendu, mais il s'avère que les nœuds DOM, qui est imprimée sont différentes de celles que les points de vue de tenir une référence, car aucune interaction que ce soit avec ces nœuds est possible à l'aide de l'instance de vue. Par exemple, si dans la vue, je dis $(this.el).hide()
, rien ne se passera.
Quelle est la bonne façon, si?
- Je ne suis pas sûr de savoir si cette technique est techniquement possible ou pas, mais je vous recommande contre elle, en tant que modèles doivent uniquement contenir des instructions conditionnelles et non pas toute la logique de l'application. La logique de l'application doit rester dans vos Vues. De cette façon, il est évident que la séparation des préoccupations et votre demande sera plus facile à gérer.
- vous pouvez imbriquer des points de vue à l'aide de React.js
Vous devez vous connecter pour publier un commentaire.
En général, je le rendu de la vue parent en premier. J'utilise ensuite la
this.$('selector')
méthode pour rechercher un élément enfant que je peux utiliser comme el de la vue enfant.Voici un exemple complet:
La accepté de répondre a un défaut majeur, qui est le fait que le ChildView va être ré-initialisées à chaque fois qu'il est rendu. Cela signifie que vous allez perdre de l'etat et éventuellement avoir à ré-initialisé compliqué points de vue sur chaque rendu.
J'ai écrit un blog à ce sujet ici: http://codehustler.org/blog/rendering-nested-views-backbone-js/
Pour résumer, si, je vous recommande d'utiliser quelque chose comme ceci:
Vous n'avez pas besoin d'étendre l'épine Dorsale de la vue si vous ne le souhaitez pas, le renderNested méthode pourrait être mis n'importe où vous le souhaitez.
Avec le code ci-dessus, vous pouvez maintenant procéder à l'initialisation ChildView dans l'initialisation de la méthode et puis tout simplement le rendre quand render() est appelée.
Découvrez la De la colonne vertébrale.Les sous-vues mixin. C'est un minimaliste mixin construit pour la gestion des vues imbriquées et de ne pas re-initialiser l'enfant vues à chaque fois que le parent est rendu.
Je ne sais pas à propos de dans les un modèle elle-même, mais je l'ai fait avec des tableaux et des listes avant le. Dans le modèle externe, juste le stub:
et pour chacun des articles:
<%= champ1 %>
puis dans votre méthode de rendu, juste rendre les éléments individuels et les ajouter à l'élément tbody...
La décision d'initialiser un nouvel objet à chaque fois que vous effectuez le rendu me semble très inefficace.
En particulier ceci:
Idéalement, le Rendu de la mère doit être quelque chose comme
Et les enfants création devrait se produire que lors de l'initialisation de la mère:
le problème est que nous n'avons pas selector1 et selector2 avant de rendre le modèle parent. C'est là que je suis bloqué à droite maintenant 🙂