9
votes

Comment charger des partiels / vues / modèles de manière dynamique dans Ember.js

donc j'ai la configuration suivante.

sur la page principale, une liste des générateurs est affichée sur la base d'une liste provenant d'un modèle à l'aide de données de fixture. P>

maintenant quand l'un des générateurs Les liens sont cliqués sur des liens, une nouvelle page est affichée avec certains champs de saisie générés de manière dynamique sur la base de ces données de fixation. p>

jusqu'à ce que tout fonctionne parfaitement. p>

maintenant lorsque je change l'entrée Valeur du champ dans la page génératrice (après avoir sélectionné l'un des générateurs) pour voir les modifications mis à jour dans une sorte de prévisualisation DIV juste en dessous de mes champs de saisie, il est facile. Je peux utiliser {{générateurfields.0.value}} code> pour lier le premier champ de saisie ,.1 ..1., Et ainsi de suite jusqu'à ce que je les lie tous. P>

mais comme vous Peut imaginer, chaque générateur a son propre format et ses propres champs d'entrée, et je souhaite créer un nouveau fichier .HBS pour chacun d'entre eux, puis transmettez ce fichier dans la page génératrice pour afficher l'aperçu. P>

J'ai résolu 0,1% du problème avec une partielle. Dans le fichier generator.hbs, j'ai entré {{partial "générateur-1"}} code> et cette charge mon _generator-3.hbs code> fichier contenant ce {{ générateurfields.0.value}} code> BIND, et ça fonctionne. Mais cette partielle n'est pas dynamique; J'ai besoin de charger une autre partie partielle chaque fois que j'utilise un générateur différent. Comment puis-je réaliser cela? P>

Comment puis-je passer le nom partiel de manière dynamique ou charger un modèle en fonction des données de modèle que j'ai? P>

Le code utilisé jusqu'à présent est ci-dessous:

idex.hbs ressemble à ceci: strong> p>

App.Store = DS.Store.extend({
    revision: 13,
    adapter: 'DS.FixtureAdapter'
});

App.Router.map(function () {
    this.resource('index', { path: '/' });
    this.resource('generator', {path: '/generator/:generator_id'});
});

App.IndexRoute = Ember.Route.extend({
    model: function () {
        return App.Generator.find();
    }
});

App.Generator = DS.Model.extend({
    title: DS.attr('string'),
    templateName:  DS.attr('string'),
    generatorFields: DS.attr('generatorFields')
});


// Fixture data

DS.RESTAdapter.registerTransform('generatorFields', {
    serialize: function(serialized) {
        return Em.none(serialized) ? {} : serialized;
    },
    deserialize: function(deserialized) {
        return Em.none(deserialized) ? {} : deserialized;
    }
});

App.Generator.FIXTURES = [{
    id: 1,
    title: "test 1",
    generatorFields: [
        {id: 1, name: "name 1", value: ""}
    ],
    templateName: "generator-1"
}, {
    id: 2,
    title: "test 2",
    generatorFields: [
        {id: 1, name: "name 1", value: ""},
        {id: 2, name: "name 2", value: ""},
    ],
    templateName: "generator-2"
}];


1 commentaires

Pourriez-vous créer un JSBIN ou JSFIDDLE montrant le problème.


4 Réponses :


15
votes

Vous pouvez créer une aide partielle dynamique qui utilise le nom transduit sur le nom avec le {{partial}} code> aide.

{{#each item in controller}}
  {{dynPartial item.templateName}}
{{/each}}


5 commentaires

Dans des moments comme ça, je me rends compte de la taille d'un noob que je suis, merci Darshan, vous avez sauvé la journée.


Je vous en prie. :) J'ai édité la réponse un peu pour le rendre extensible. Je me suis produit que les arguments pouvaient être passés de l'avant.


Cela semble être plus de travail que nécessaire. Je ne peux pas comprendre une autre façon de le faire.


Il n'est pas nécessaire de créer un assistant spécifique pour cela. L'assistant intégré partiel est capable de prendre un nom de propriétés ou une simple chaîne afin de déterminer le nom des modèles. Voir la réponse de Kamrenz ci-dessous.


@Darshansawardekar va-t-il fonctionner avec Ember 1.10 + (templissage basé sur HTMLBARS)?



5
votes

Vous devriez pouvoir simplement placer votre variable partielle dynamique au sein de l'aide partielle.

{{#each item in controller}}
    {{partial item.templateName}}
{{/each}}


0 commentaires

1
votes

Alors que la réponse de @ Darshan est plus simple que ci-dessous et fonctionnera dans de nombreux cas, je viens de courir dans un problème où la transition vers un même itinéraire avec un modèle différent entraîne la partielle de ne pas re-rendu si le nom partiel du second modèle est la même chose que le premier (bug in Ember?). Configuration d'une vue qui regarde le modèle corrige cela.

view App.FooDynamicLayout templateName=dynamicTemplateName model=model


0 commentaires

0
votes

@kamrrenz a déjà mentionné cela mais j'ai pensé que je citerais un chapitre et un verset pour ceux qui cherchent à cela. Des versions plus récentes de Ember acceptent gracieusement les noms de propriétés liés et les utilisent dans l'assistance partielle:

http://ember-doc.com/classes/ember.handlebars.helpers.html#method_partel

Noms de modèle lié Le paramètre fourni à partielle peut aussi être un chemin d'accès à une propriété contenant un nom de modèle, E.G.: xxx

L'exemple ci-dessus recherchera la valeur de SomeemplatName sur le contexte de modèle (par exemple un contrôleur) et utilisez cette valeur comme nom de le gabarit pour rendre. Si la valeur résolue est FALSY, rien ne sera être rendu. Si SomeemplatName change, le partiel sera Rendé à l'aide du nouveau nom de modèle.


0 commentaires