94 votes

Besoin de Handlebars.js pour afficher les données de l'objet au lieu de "[Object object]"

Je suis en train d'utiliser des modèles Handlebars et les données JSON sont déjà représentées par [Object object], comment puis-je analyser ces données en dehors de Handlebars? Par exemple, j'essaie de remplir une variable JavaScript sur la page à travers une balise handlebars, mais cela ne fonctionne pas.

Des suggestions? Merci!

EDIT:

Pour clarifier, j'utilise ExpressJS avec Handlebars pour le templating. Dans ma route, j'ai ceci:

var user = {}
user = {'id' : 123, 'name' : 'Prénom'}

res.render('index', {user : user});

Ensuite, dans mon modèle index.hbs, j'ai maintenant un objet {{user}}. Je peux utiliser {{#each}} pour itérer à travers l'objet sans problème. Cependant, j'utilise également Backbone.js et je veux passer ces données à une Vue, comme ceci:

myView = new myView({
   user : {{user}}
});

Le problème est que {{user}} affiche simplement [Object object] dans la source. Si je le mets dans console.log, j'obtiens une erreur qui dit 'Identifiant inattendu'.

0 votes

Vous devrez élaborer sur la phrase "ne fonctionne pas". Pouvez-vous fournir un extrait de code pertinent et une description de ce que vous attendez plutôt que [Object object]? Si vous essayez simplement de voir les clés/valeurs de l'objet, vous voudrez utiliser console.log avec un débogueur ou JSON.stringify.

0 votes

Console.log montre [Object object] aussi. Je vais mettre à jour le message pour expliquer mieux.

1voto

Terry Points 7652

Vous essayez de passer une syntaxe de modèle {{}} à l'intérieur d'un objet JSON, ce qui n'est pas valide.

Vous devrez peut-être faire ceci à la place :

myView = new myView({ user : user });

1voto

cf512 Points 31

Pour condenser (ce que j'ai trouvé être) les réponses les plus utiles...

JSON helper pour handlebars (crédit) :

Handlebars.registerHelper("json", function (context) {
    return JSON.stringify(context);
});

JSON helper pour express-handlebars (crédit et j'ai mis à jour aux dernières conventions) :

app.engine(
    "handlebars",
    exphbs.engine({
        defaultLayout: "main",
        helpers: {
            json: function (context) { 
                return JSON.stringify(context);
            }
        }
    })
);

Et ensuite du côté du template : {{json example}}

0voto

Phil C Points 167

Si vous souhaitez avoir plus de contrôle sur la mise en forme de la sortie, vous pouvez écrire votre propre assistant. Celui-ci contient une fonction récursive permettant de parcourir des objets imbriqués.

  Handlebars.registerHelper('objToList', function(context) {
    function toList(obj, indent) {
      var res=""
      for (var k in obj) { 
          if (obj[k] instanceof Object) {
              res=res+k+"\n"+toList(obj[k], ("   " + indent)) ;
          }
          else{
              res=res+indent+k+" : "+obj[k]+"\n";
          }
      }
      return res;
    }    
    return toList(context,"");
  });

Nous avons utilisé Handlebars pour les modèles d'e-mail et cela s'est avéré utile pour un utilisateur comme celui-ci :

{
  "user": {
    "id": 123,
    "name": "Prénom",
    "account": {
      "bank": "Wells Fargo",
      "sort code": "123-456"
    }
  }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X