Ich verwende Lenkervorlagen und JSON-Daten sind bereits in [Objektobjekt] dargestellt. Wie analysiere ich diese Daten außerhalb der Lenker? Ich versuche beispielsweise, eine JavaScript-Variable auf der Seite über ein Lenker-Tag zu füllen, aber das funktioniert nicht.
Irgendwelche Vorschläge? Vielen Dank!
BEARBEITEN:
Zur Verdeutlichung verwende ich ExpressJS mit Lenker für Vorlagen. Auf meiner Route habe ich Folgendes:
var user = {}
user = {'id' : 123, 'name' : 'First Name'}
res.render('index', {user : user});
Dann habe ich in meiner index.hbs-Vorlage jetzt ein {{user}}
Objekt. Ich kann {{#each}}
das Objekt gut durchlaufen. Ich verwende jedoch auch Backbonejs und möchte diese Daten an eine Ansicht wie die folgende übergeben:
myView = new myView({user : {{user}});
Das Problem ist, dass es {{user}}
einfach [Object object]
in der Quelle angezeigt wird, wenn ich es in console.log einfüge. Ich erhalte die Fehlermeldung "Unerwarteter Bezeichner".
[Object object]
? Wenn Sie lediglich versuchen, die Schlüssel / Werte des Objekts anzuzeigen, sollten Sie sieconsole.log
mit einem Debugger oder verwendenJSON.stringify
.Antworten:
Bei der Ausgabe
{{user}}
ruft der Lenker zuerst den Wert desuser
'ab.toString()
. Für einfacheObject
s ist das Standardergebnis das, was"[object Object]"
Sie sehen.Um etwas Nützlicheres zu erhalten, möchten Sie entweder eine bestimmte Eigenschaft des Objekts anzeigen:
Oder Sie können einen Helfer verwenden / definieren, um das Objekt anders zu formatieren:
Handlebars.registerHelper('json', function(context) { return JSON.stringify(context); });
myView = new myView({ user : {{{json user}}} // note triple brackets to disable HTML encoding });
quelle
app.set('view engine', 'hbs'); var Handlebars = require('hbs');
var exphbs = require('express-handlebars'); app.engine('handlebars', exphbs({ helpers: { json: function (context) { return JSON.stringify(context); } } }));
res.render('index', { var1: 'some value', helpers: { json: function (context) { return JSON.stringify(context); } });
User
Typs freigeben und die Instanz für den Client rekonstruierenuser : new User({{{json user}}})
.Sie können den JSON einfach stringifizieren :
var user = {} user = {'id' : 123, 'name' : 'First Name'}; // for print user.stringify = JSON.stringify(user);
Dann im Vorlagendruck von:
quelle
Ich verwende serverseitiges Template in Node-Js, aber dies kann auch clientseitig gelten. Ich registriere Jonathans Json-Helfer im Knoten. In meinem Handler füge ich über res.locals Kontext (z. B. Adressbuch) hinzu. Dann kann ich die Kontextvariable clientseitig wie folgt speichern:
<script> {{#if addressBook}} console.log("addressBook:", {{{json addressBook}}}); window.addressBook = {{{json addressBook}}}; {{/if}} </script>
Beachten Sie die dreifachen Locken (wie von Jim Liu hervorgehoben ).
quelle
Sie versuchen, die Template-Syntax
{{ }}
in einem ungültigen JSON-Objekt zu übergeben.Möglicherweise müssen Sie stattdessen Folgendes tun:
myView = new myView({ user : user });
quelle
Wenn Sie mehr Kontrolle über die Ausgabeformatierung wünschen, können Sie Ihren eigenen Helfer schreiben. Dieser hat eine rekursive Funktion zum Durchlaufen verschachtelter Objekte.
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,""); });
Wir haben Lenker für E-Mail-Vorlagen verwendet. Dies hat sich für einen Benutzer wie den folgenden als nützlich erwiesen
{ "user": { "id": 123, "name": "First Name", "account": { "bank": "Wells Fargo", "sort code": " 123-456" } } }
quelle