Scrivere un aiutante che produce risultati legati?
Domanda
Ho un aiutante di formattazione data/ora ma ciò che produce non si aggiorna quando la proprietà sottostante cambia. Questa non è una sorpresa, ma qualcuno sa come produrre attacchi negli aiutanti?
Invoco l'aiutante in questo modo ...
{{timestamp created_at}}
... ed ecco l'aiutante stesso:
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>");
});
Soluzione
Ora è possibile creare aiutanti a manubrio legati che utilizzano un'API di Ember pubblica.
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 all'aiutante sarà già stato risolto e l'aiutante verrà nuovamente chiamato ogni volta che il percorso cambia.
Altri suggerimenti
Purtroppo è più complesso di quanto vorrei creare un aiutante personalizzato con contenuti legati. Ecco un esempio che Peter Wagenet ha scritto: https://gist.github.com/1563710
Farò pressioni per questo per diventare più facile.
Non sono sicuro se questo si applica a questa particolare domanda, ma ho anche creato aiutanti nelle viste e volevo che i valori si aggiornino quando i dati nella vista Ember.js sono cambiati. Il modo in cui ho risolto questo problema era scrivere un osservatore sui valori che volevo modificare e usare jQuery per aggiornare il valore specifico.
Ad esempio (in caffè):
...
attrObserver: Ember.observer(() ->
$("#attrId").text(this.get("attr"))
...