1

我有一個i18n翻譯字符串的列表,我正在迭代一個流星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); 
    } 
    } 
} 

然而,當我這樣做,我失去了反應性。如何解決這個問題呢?我是最佳實踐和優雅代碼的粉絲。

謝謝。

回答

2

您需要

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

這就造成在Template.templateName一個模板,將與爲它定義的助手反應預編譯車把模板。

EventedMind有一些截屏,顯示它是如何工作在良好的細節:

+0

謝謝。在客戶端嘗試了這個,但是沒有骰子Meteor._def_template(「lang.language」,function(){console.log(「Hola!」); 返回「Text in Spanish」; }); – 2013-05-01 11:58:29

+0

我只是試過這個,它的工作原理。 (注意你不能在模板名稱中使用'.',它必須是一個標準的對象鍵(字母,數字,下劃線)。例如,我用'lang'嘗試了同一個模板,並且我在Template處得到了一個新模板.lang – Akshat 2013-05-01 12:15:52

+0

好吧,我仍然在HTML中定義模板,例如我有。我想要做的是在整個站點的不同模板中動態地更新數百個翻譯後的字符串,我必須在JS中創建所有的模板嗎? – 2013-05-01 12:22:56

0

我的文本編輯器一直叫我 「邪惡」 的使用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); 
}