2014-02-23 6 views
7

Ich habe einen Helfer namens Feature bekam die wie folgt aussieht:Kann man einen Lenkerhelfer vor dem Rendern "binden"? (Unter Verwendung von Express & hbs)

hbs.registerHelper('feature', function(request, flag, options) { 
    if (features(flag, request)) { 
    return options.fn(this); 
    } else if (options.inverse) { 
    return options.inverse(this); 
    } 
}); 

Und in der Vorlage immer so benutzten:

{{feature request "some-feature"}} ... {{/feature}} 

Ich würde gerne in der Lage sein, den request Teil in der Vorlage zu entfernen, da es immer denselben Wert hat und sich nie ändert. Also stelle ich mir vor, ich könnte request an feature binden, wenn es gerendert wird, und natürlich ändert sich das jedes Mal und ich möchte nicht, dass es zu anderen Anfragen verschüttet wird.

Etwas wie:

res.render("page", { 
    feature: hbs.helper.feature.bind(null, req) 
}); 

Ist das möglich?

Antwort

2

Wenn Sie keinen bekannten Helfermodus verwenden, überprüft die Helferauswertung den Kontext, so dass Sie eine Bindung übergeben können, wie oben beschrieben, und es sollte funktionieren.

Unter dem neuesten Code in Lenkern beherrschen die eval so etwas wie ist:

helper = helpers.foo || (depth0 && depth0.foo) || helperMissing 
helper.call(depth0, 1, {"name":"foo","hash":{},"data":data} 

Wo depth0 das aktuelle Kontextobjekt ist. Der Vorbehalt hier ist, dass Helfer Priorität haben, so dass Sie sie anders benennen müssen. Sie sollten auch in der Lage sein, etwas wie {{./foo bar}} zu tun, um der Version des lokalen Kontexts Priorität einzuräumen, aber es scheint, dass wir eine bug haben, wo dies unter diesem bestimmten Syntaxkonstrukt nicht berücksichtigt wird.

Verwandte Themen