La dorsale Marionette, la vue composite s’initialise deux fois

J’utilise une vue composite dans laquelle $ .dialog est appelé $ el.

La vue composite répertorie ensuite les éléments d’une collection.

Maintenant, j’ai essayé plusieurs manières de restituer les éléments de la collection: extraire de la vue composite avant et après l’attachement à la vue, chercher dans la vue, précharger la collection à partir du script de mon serveur, etc.

tout semble fonctionner mais le même problème se pose.

dès que la vue composite voit cette collection, elle appelle à nouveau sa propre fonction d’initialisation …

Je comprends tout à fait que la fonction de rendu sera appelée lors d’une réinitialisation de collection ou de l’ajout … mais l’initialisation ??? Je ne sais absolument pas pourquoi cela se produit.

showCustomFieldSelect: function(e){ log('sortingggered'); e.preventDefault(); var cl = new AustApp.Collections.CustomField; var select = new AustApp.Views.AvailableCustomFieldsList({ el: "#available-custom-fields-popup", collection: cl }); cl.fetch(); cl.once("reset", function(){ // this bind was // previously used for creating the view // or calling render functions directly // amongst numerous efforts to debug }, this); }, MyApp.Views.AvailableCustomFieldsList = function(){ var AvailableCustomFieldsList = Backbone.Marionette.CompositeView.extend({ template: "#available-contact-list-custom-field-list-js", tag: "div", itemView: AustApp.Views.AvailableCustomFieldsListItem, emptyView: AustApp.Views.EmptyAvailableCustomFieldsListItem, itemViewContainer: "ul", templateHelpers: viewHelpers, initialize: function(){ log('init called'); // called twice????? this.render(); this.$el.dialog({ title: "Available Custom Fields", width: '600px', modal: true, dialogClass: "round", }); }, /* stuff */ }); return AvailableCustomFieldsList; }(); 

Toute aide appréciée car je suis déconcerté

Pour moi, cela a été corrigé (après de nombreuses heures à me cogner la tête sur la table), mais en s’assurant que ItemView été déclaré avant CompositeView !!

Travaux:

 MyItemView = Marionette.ItemView.extend({ /* STUFF */ }) MyCompView = Marionette.CompositeView.extend({ itemView: MyItemView }) 

Ne fonctionne pas (init appelé deux fois sans aucun argument):

 MyCompView = Marionette.CompositeView.extend({ itemView: MyItemView }) MyItemView = Marionette.ItemView.extend({ /* STUFF */ }) 

Peu importe même si nous obtenons une instance de MyCompView après que les deux ont été déclarés, itemView doit être déclaré avant la vue compsite.

J’ai donc limité le problème au moment où les vues d’élément sont déclarées après la vue composite qui est également contenue dans une autre vue composite.

modifier la vue composite nestede dans une vue d’élément corrigeait le problème, mais ensuite … changer la vue composite nestede dans une vue de collection créait l’erreur que l’élément itemView n’était pas disponible pour la collection

et en déplaçant ainsi la déclaration de la vue nestede au-dessus de la déclaration de la vue de collection, elle l’a corrigée … Puis sa modification a révélé que les vues composites nestedes fonctionnaient lorsque les déclarations étaient dans le bon ordre .

Je pense que cela devrait être moins trompeur, car une double initialisation de la vue composite est tout simplement déroutant et devrait générer une erreur concernant l’élément non défini, si possible derick ^ _ ^

Merci

Merci pour l’explication ci-dessus.

J’ai eu le même problème. Si aucun itemView n’est défini avec la vue composite, il appelle sa fonction d’initialisation chaque fois que sa collection change.

J’ai résolu ce problème en utilisant une vue vide comme vue d’élément.

(J’utilisais ma vue composite à une autre fin et je n’avais pas besoin d’une vue d’élément avec elle.)

Pour les utilisateurs RequireJS et / ou les utilisateurs compilant (minimisant) JavaScript

Je tiens à append que lors de la modification (de la minimisation) de votre JavaScript, le moteur de conversion peut déclarer des choses en panne (c’est-à-dire que CompositeView et ItemView peuvent être déclarés dans l’ordre inverse, comme @Thomas Hudspith-Tatham et @simbolo mentionnés). Le problème est plus courant lors de la modularisation de votre Backbone.Marionette avec requireJS et de l’optimisation (compilation) du code.

Malheureusement, je ne connais pas de solution fiable, à part la recompilation du code, qui a fonctionné pour moi.

Je partage mon expérience. Cela pourrait aider quelqu’un.

J’ai rencontré le même genre de problème. À Initial, je pensais que l’événement avait été déclenché deux fois, mais en réalité, il avait été écouté deux fois, ce qui entraînait un comportement anormal de l’application.

Mon événement a été déclenché une fois de la vue composite (un déclencheur), mais a été écouté deux fois (2 activés) en raison de deux instances du contrôleur de contact.

J’ai corrigé en m’assurant de ne disposer que d’un écouteur (une instance de contrôleur) pour un comportement particulier (dans mon cas, ouvrez une boîte de dialog d’édition).

Remarque . J’ai plusieurs contrôleurs dans mon application et je charge à l’aide de require.