Динамически создавать помощники по шаблонам Meteor Handlebars?

У меня есть список строк перевода i18n в объекте meteor-i18n, который я повторяю. Однако вместо создания помощника по шаблону для каждой строки вручную, который вскоре стал бы избыточным и повторяющимся, я хотел бы создать помощника динамически, в цикле, например так:

for (var namespace in Meteor.i18nMessages) {
  for (var msg in Meteor.i18nMessages[namespace]){
    //Template[namespace][msg] = __(namespace + "." + msg); // <- works but is not reactive
    Template[namespace][msg] = function() { // <- Doesn't work: always returns last value from object
      return __(namespace + "." + msg);
    }
  }
}

Однако, когда я это делаю, я теряю реактивность. Как бы это решить? Я поклонник лучших практик и элегантного кода.

Спасибо.


person Kris Haamer    schedule 01.05.2013    source источник


Ответы (2)


Вам необходимо предварительно скомпилировать шаблоны рулей с помощью

Meteor._def_template("templateName", function () { 
    return "your html"
});

Это создает шаблон в Template.templateName, который будет реактивным с определенными для него хелперами.

У EventedMind есть несколько скринкастов, которые подробно показывают, как это работает:

person Tarang    schedule 01.05.2013
comment
Спасибо. Пробовал это в клиенте, однако нет кости Meteor._def_template(lang.language, function () { console.log(Hola!); return Text in Spanish; }); - person Kris Haamer; 01.05.2013
comment
Я только что попробовал это, и это работает. (обратите внимание, что вы не можете использовать . в имени шаблона, это должен быть стандартный ключ объекта (буквы, цифры, подчеркивание). Например, я попробовал ваш тот же ключ с «lang», и я получил новый шаблон в Template.lang - person Tarang; 01.05.2013
comment
Хорошо, понял. Я все еще определяю шаблоны в HTML, поэтому, например, у меня есть ‹template name=lang›{{language}}‹/template› и ‹template name=footer›{{translatedfootertext}}‹/template›. Что я хочу сделать, так это динамически обновлять сотни переведенных строк в разных шаблонах на сайте. Должен ли я создавать все шаблоны в JS? - person Kris Haamer; 01.05.2013
comment
Вы можете использовать один из пакетов для атмосферы, чтобы помочь вам, как этот: github.com/txgruppi /метеор-простой-i18n - person Tarang; 01.05.2013
comment
Это немного другое, но основной принцип остается тем же. Вам нужно передать строки с помощью помощников шаблона, например Template.hello.lang = function() {return Sesson.get('translatedMessage')} - person Tarang; 01.05.2013
comment
Это то, что я делал, однако проблема заключалась в том, что я не реагировал на создание помощников шаблона в цикле. Что я и спрашивал. Сейчас я опубликовал версию, которая работает (но уродлива). - person Kris Haamer; 02.05.2013

Мой текстовый редактор продолжает называть меня «злом» за использование eval, но это работает:

for (var namespace in Meteor.i18nMessages) {
  var obj = {};
  for (var msg in Meteor.i18nMessages[namespace]) {
    var str = 'obj["' + msg + '"] = function() { return __("' + namespace + '.' + msg + '"); }';
    console.log(str);
    eval(str);
  } 
  Template[namespace].helpers(obj);
}
person Kris Haamer    schedule 01.05.2013