2013-02-08 15 views
41

Ad esempio, esiste un modo per nidificare l'helper "i18n" all'interno della variabile hash di un altro helper?È possibile nidificare gli helper all'interno dell'hash delle opzioni con i manubri?

{{view "SearchView" placeholder="{{t 'search.root'}}" ref="search" url="/pages/search" className='home-search' polyfill=true}} 
+0

Qual è il tuo cruccio esattamente? La sintassi '{{mustache}}' all'interno dell'helper o il fatto che devi passare un valore localizzato all'helper? – jevakallio

+0

hai capito bene, vorrei usare la sintassi {{mustache}} all'interno dell'helper invece di passare un valore localizzato all'helper. Modificherò la mia domanda, solo un secondo. – mateusmaso

+0

il problema è che il manubrio non ti permette di usare una sintassi {{moustache}} all'interno di un'opzione helper – mateusmaso

risposta

68

Aggiornamento: Manubrio ora supporta subexpressions, così appena si può fare:

{{view "SearchView" (t 'search.root')}} 
+1

Questa è la risposta corretta (e _much better_). Grazie! – alexlafroscia

11

Lo scenario non è supportato direttamente, ma esistono un paio di soluzioni alternative che è possibile utilizzare. Il manubrio aiutanti sono solo codice javascript, in modo da poterli eseguire all'interno del codice helper:

function translateHelper() { 
    //... 
} 

function viewHelper = function(viewName, options) { 
    var hash = options.hash; 
    if(hash.placeholder) { 
     hash.placeholder = translateHelper(hash.placeholder); 
    } 
}; 

Handlebars.registerHelper('view', viewHelper); 
Handlebars.registerHelper('t', translateHelper); 

E basta passare la chiave i18n per come l'argomento:

{{view placeholder="search.root"}} 

Questo è bello, come a lungo come il tuo helper sa quali argomenti devono essere localizzati e quali no. Se ciò non è possibile, si può provare l'esecuzione di tutti gli argomenti di supporto attraverso il manubrio, se contengono un'espressione manubrio:

function resolveNestedTemplates(hash) { 
    _.each(hash, function(val, key) { 
    if(_.isString(val) && val.indexOf('{{' >= 0)) { 
     hash[key] = Handlebars.compile(val)(); 
    } 
    }); 
    return hash; 
} 

function view(viewName, options) { 
    var hash = resolveNestedTemplates(options.hash, this); 
} 

e utilizzare la sintassi modello nidificato hai descritto:

{{view placeholder="{{t 'search.root'}}" }} 

mi rendo conto né di queste opzioni sono perfette, ma sono le migliori che potessi pensare.

+0

grazie amico, ottima risposta tra l'altro .. come hai detto il mio translateHelper può anche prendere più opzioni così la tua seconda soluzione potrebbe essere la soluzione migliore per ora, migliorerò il metodo ma l'idea ancora lo stesso .. Mi chiedo solo se dovrei fare errori su come il manubrio dovrebbe funzionare davvero – mateusmaso

+0

@mateusmaso, la mia soluzione proposta non è esattamente come dovrebbe funzionare il manubrio, te lo garantisco, ma d'altra parte Non vedo una grande alternativa al tuo particolare problema. Forse guarda in partial e blocca gli helper e vedi se c'è una soluzione più naturale per il tuo caso: https://github.com/wycats/handlebars.js/ – jevakallio

+0

sì, ho posto la stessa domanda all'interno del loro problema di repository github .. vediamo cosa ne pensano, ma sono d'accordo con te .. non può essere nidificato troppo, in tal caso dovrei spostarlo nell'oscilloscopio perché il codice del template sarà illeggibile – mateusmaso

Problemi correlati