2016-08-17 2 views
0

J'utilise actuellement Marionette 2.4.7 et mon application est structurée en utilisant LayoutViews. Prenez le très simple exemple LayoutViews (normalement les templates sont séparés):Marionette LayoutAfficher les régions - Afficher hors ArticleVoir le contenu

var LayoutView = Marionette.LayoutView.extend({ 
    template: "<div id="main-region"></div><div id="menu-region"></div>", 
    regions: { 
     mainRegion: "#main-region", 
     menuRegion: "#menu-region" 
    } 
}); 

var MainLayoutView = Marionette.LayoutView.extend({ 
    template: "<div id="title-region"></div><div id="content-region"></div>", 
    regions: { 
     titleRegion: "#title-region", 
     contentRegion: "#content-region" 
    } 
}); 

Fondamentalement, la page est divisée en deux sections, une section pour afficher la page titre et une section pour afficher le contenu principal. Je peupler la région du contenu en utilisant les éléments suivants:

var layoutView = new LayoutView(); 

    var mainLayoutView = new MainLayoutView({ className: "someClass" }); 
    layoutView.mainRegion.show(mainLayoutView); 
    var contentLayoutView = new ContentLayoutView(); 
    mainLayoutView.contentRegion.show(contentLayoutView); 

Le ContentLayoutView a des sous-régions et fait beaucoup d'autres choses, est donc tout à fait une vue complexe. Le titleRegion du MainLayoutView n'affiche que quelques mots, donc très simple.

Maintenant, à ma question, est-il possible de contourner le besoin de créer un ItemView pour le titleRegion, juste pour afficher quelques mots? Ce scénario est répété plusieurs fois tout au long de mon application et il semble nécessaire de créer un ItemViews distinct pour chaque cas. Je sais que je peux régler le DIV HTML en utilisant:

$("#title-region").html("Page title"); 

mais je veux rester à la façon Marionette de faire les choses.

J'ai essayé:

mainLayoutView.titleRegion.show("Page name"); 

mais je reçois l'erreur: 'view.on' is not a function, évidemment parce que le .show attend un ItemView/LayoutView.

+0

Est-ce que votre 'mainLayoutView' est rendu quand vous avez besoin le titre à changer ou avez-vous besoin que le titre change lorsque vous changez la vue dans 'contentRegion'? – rdubya

+0

@rdubya Le 'mainLayoutView' est rendu à nouveau lorsque l'utilisateur fait défiler un menu, les' titleRegion' et 'contentRegion' étant définis à chaque fois. –

+0

Pouvez-vous ajouter la partie pertinente du code qui fait le rendu? Si vous ne pouvez pas, c'est bon. Il serait juste un peu plus facile de vous donner un exemple de code si je pouvais le voir. – rdubya

Répondre

1

J'inclurais probablement le titre dans le modèle de mainLayoutView. Je ne sais pas quelle langue templating que vous utilisez, mais il pourrait ressembler à:

"<div id="title-region">{title}</div><div id="content-region"></div>"

Ensuite, vous pouvez définir une fonction templateHelpers dans votre définition MainLayoutView comme:

templateHelpers: function() { 
    return { title: this.options.title }; 
} 

Lorsque vous créez votre MainLayoutView alors vous passer à quelque titre que vous avez besoin:

var layoutView = new LayoutView(); 
var mainLayoutView = new MainLayoutView({ 
              className: "someClass", 
              title: "Welcome!" 
             }); 
layoutView.mainRegion.show(mainLayoutView); 
var contentLayoutView = new ContentLayoutView(); 
mainLayoutView.contentRegion.show(contentLayoutView); 

title peut effectivement déjà être une propriété sur la vue (je ne me souviens pas), donc vous devrez utiliser layoutTitle ou quelque chose comme ça dans les endroits que j'ai utilisés title

+0

Très belle solution :) À la vôtre. –

+0

J'ai maintenant trouvé le problème où 'contentRegion' contient un menu qui doit mettre à jour le' titleRegion' lorsque l'utilisateur navigue. –