2012-01-12 14 views
13

Ho un helper di formattazione per data/ora, ma ciò che produce non si aggiorna quando la proprietà sottostante cambia. Questa non è una sorpresa, ma qualcuno sa come produrre legature negli aiutanti?Scrivere un helper che produce risultati associati?

invoco l'aiuto come questo ...

{{timestamp created_at}} 

... e qui è l'helper:

Handlebars.registerHelper('timestamp', function(context, options) { 
    var formatter  = options.hash['format'] ? options.hash['format'] : 'hh:mm a MM-DD-YYYY'; 
    var original_date = Ember.getPath(this, context); // same as this.get(context) ? 
    var parsed_date  = moment(original_date); 
    var formatted_date = parsed_date.format(formatter); 

    return new Handlebars.SafeString("<time datetime=" + original_date +">" + formatted_date + "</time>"); 
}); 
+1

Un piccolo aggiornamento a questo solo per ricordare che l'aiutante legato è appena stato impegnato a padroneggiare. vedere https://github.com/emberjs/ember.js/commit/46469831e7fe22d43b5dcfdf7ff60bd7000aa9de –

risposta

27

È ora possibile creare aiutanti Manubri rilegati utilizzando un'API pubblica Ember.

Handlebars.registerBoundHelper('timestamp', function(date, options) { 
    var formatter  = options.hash['format'] ? options.hash['format'] : 'hh:mm a MM-DD-YYYY'; 
    var parsed_date  = moment(date); 
    var formatted_date = parsed_date.format(formatter); 

    return new Handlebars.SafeString("<time datetime=" + date +">" + formatted_date + "</time>"); 
}); 

Il parametro passato al aiutante saranno già stati risolti, e l'aiutante sarà chiamato di nuovo ogni volta che cambia il percorso.

+0

È davvero fantastico! Aggiunge un ulteriore livello di flessibilità. Personalmente ho in mente "localizzazione". Un aiuto "t" per tradurre una stringa che si aggiornerà automaticamente quando l'array STRINGS cambia. Eccezionale. Ci proveremo. – nembleton

+0

Nota che non può essere utilizzato con un blocco di blocchi: http://stackoverflow.com/questions/18005111/custom-handlebars-helper-parameter-is-not-vedolated –

+1

Se hai bisogno di un helper di blocco, è probabile che dovresti essere usando un componente. –

10

Si tratta, purtroppo, più complessa di quanto mi piacerebbe creare un helper personalizzato con contenuto associato. Ecco un esempio di ciò che Peter Wagenet ha scritto: https://gist.github.com/1563710

Faremo pressioni affinché questo diventi più semplice.

+0

Crap che è anche più complesso di quanto pensassi sarebbe ... Sarei interessato a vedere come ciò diventa più semplice. –

+0

concordato. Ci dovrebbe sicuramente essere un po 'di zucchero qui. – ghempton

+0

Si noti che l'ultima versione di Ember si interrompe perché Ember.Metamorph è stato rinominato Ember._Metamorph. Ecco un elenco aggiornato: https://gist.github.com/2588802 – rlivsey

0

Non sono sicuro se questo si applica a questa particolare domanda, ma ho anche creato degli helper nelle viste e ho voluto che i valori si aggiornassero quando i dati nella vista Ember.js sono cambiati. Il modo in cui ho risolto questo problema è stato scrivere un osservatore sui valori che volevo modificati e utilizzare jQuery per aggiornare il valore specifico.

Per esempio (in CoffeeScript):

... 

attrObserver: Ember.observer(() -> 
    $("#attrId").text(this.get("attr")) 

... 
Problemi correlati