2013-07-20 38 views
3

我試圖用ember.js/emblem.js寫一個登錄表單。一切正常,除非我嘗試I18ning佔位符,像這樣:用Emblem.js插入翻譯到佔位符

Em.TextField valueBinding="view.username" placeholder="#{t 'users.attributes.username}" 
Em.TextField valueBinding="view.password" placeholder="#{t 'users.attributes.password'}" type="password" 

我得到了同樣的答覆,如果我嘗試:

= input value=view.username placeholder="#{t 'users.attributes.username}" 
= input value=view.password placeholder="#{t 'users.attributes.password'}" type="password" 

在這兩種情況下,我得到這個錯誤信息:

Pre compilation failed for: form 
. . . . 
Compiler said: Error: Emblem syntax error, line 2: Expected BeginStatement or DEDENT but "\uEFEF" found. Em.TextField valueBinding="view.username" placeholder="#{t 'users.attributes.username}" 

我認爲這是發生的,因爲我試圖從一個正在編譯的語句中編譯一些東西。

input value=view.username placeholder="#{t 'users.attributes.username}" 
input value=view.password placeholder="#{t 'users.attributes.password'}" type="password" 

但缺點是值綁定不再工作,仍有形式不可操作:在這方面的證據,如果我的代碼更改爲我沒有得到的運行時錯誤。有沒有另外一種方法可以解決我沒有考慮過的問題?

回答

3

正如Alexander指出的那樣,這是Ember和Handlebars的限制。我一直在使用的解決方法是使placeholder引用一個控制器屬性,然後返回翻譯的字符串。例如:

{{input 
    type="text" 
    value=controller.filterText 
    placeholder=controller.filterPlaceholder }} 

然後在控制器:

filterPlaceholder: function() { 
    return i18n.t('players.filter'); 
}.property('model.name'), 
+0

輝煌。比我一直使用的解決方案更加優雅。 – nullnullnull

+0

控制器並不是一個真正的增加這些東西的好地方。你應該爲此創建一個視圖。 – robertodecurnex

1

我注意到第一個打字錯誤placeholder="#{t 'users.attributes.username}"。它缺少結束單引號。

Emblem syntax error, line 2: Expected BeginStatement or DEDENT but "\uEFEF" found.可能會引起誤解。我發現這個錯誤完全是針對報道的內容。例如,對於純文本,沒有|linkTo報告了類似的錯誤。

+0

可靠的建議。我是ember.js的新手,從長遠來看,這樣的指針會幫助你很多。不幸的是,目前這個錯誤似乎與佔位符有關。當我刪除該代碼時,頁面呈現正常。有了它,我得到了錯誤。即使添加結束引號時,這種情況仍會繼續。 – nullnullnull

+0

不知道還有什麼我可以建議。嘗試在[回購](https://github.com/machty/emblem.js/issues)添加問題,@machty可能會提供幫助。 –

+0

我會回答作爲答案... –

3

這超出了Emblem能夠做的範圍,因爲它是Ember +把手的固有限制。你要做的是使用input幫助程序,並在幫助程序調用中使用另一個幫助程序t來獲取placeholder選項的值。你不能(現在)在Ember中這樣做,所以Emblem無法爲你做到這一點。

編輯:你應該試試Ember i18n庫。我還沒有使用它,但它似乎像什麼,你會想要做的是在TranslateableAttributes混合混入到Ember.View,如:

Ember.View.reopen(Em.I18n.TranslateableAttributes) 

,然後在你的徽記模板,你可以做一些事情像

= input placeholderTranslation="button.add_user.title" 
+0

謝謝澄清。現在我將硬編碼佔位符,並希望燼團隊實現一種嵌套助手的方式。 – nullnullnull

+0

我添加了一些你可以用來解答的選擇。 –

0

您應該使用視圖來格式化的東西,並將其拖放到模板。控制器無意知道模板發生了什麼。

你也希望這是一個屬性,所以i18n只會工作一次,然後你可以使用緩存版本。

Templete:

{{input value=view.username placeholder=view.usernamePlaceholder}} 
{{input value=view.password placeholder=view.passwordPlaceholder type="password"}} 

查看:

export default Ember.View.extend({ 

    usernamePlaceholder: function() { 
    return Ember.I18n.t('users.attributes.username'); 
    }.property(), 

    passwordPlaceholder: function() { 
    return Ember.I18n.t('users.attributes.password'); 
    }.property() 

});