Написание помощника, который дает связанные результаты?
Вопрос
У меня есть помощник форматирования даты/времени, но то, что он производит, не обновляется при изменении основного свойства. Это не сюрприз, но кто -нибудь знает, как производить привязки в помощниках?
Я призываю помощника так ...
{{timestamp created_at}}
... и вот сам помощник:
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>");
});
Решение
Теперь можно создать помощников из связанных рулей, используя публичный API 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>");
});
Параметр, переданный помощнику, уже будет разрешен, и помощник снова будет вызван, когда изменяется путь.
Другие советы
К сожалению, это сложнее, чем я хотел бы создать пользовательского помощника с связанным контентом. Вот пример, который писал Питер Вагенет: https://gist.github.com/1563710
Я буду лоббировать, чтобы это стало легче.
Не уверен, что это относится к этому конкретному вопросу, но я также создал помощников в представлениях и хотел, чтобы значения обновлялись, когда данные в представлении Ember.js изменялись. То, как я решил эту проблему, состояло в том, чтобы написать наблюдатель об значениях, которые я хотел, изменил, и использовал jQuery для обновления конкретного значения.
Например (в CoffeeScript):
...
attrObserver: Ember.observer(() ->
$("#attrId").text(this.get("attr"))
...