3

我正在尝试使用 ember.js/emblem.js 编写登录表单。一切正常,除非我尝试像这样 I18ning 占位符:

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"

但缺点是值绑定不再起作用,这仍然使表单无法操作。还有另一种我没有考虑过的解决这个问题的方法吗?

4

4 回答 4

3

正如 Alexander 指出的,这是 Ember 和 Handlebars 的限制。我一直在使用的解决方法是placeholder引用一个控制器属性,然后返回翻译后的字符串。例如:

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

然后在控制器中:

filterPlaceholder: function () {
    return i18n.t('players.filter');
}.property('model.name'),
于 2014-03-03T11:10:02.100 回答
3

这超出了 Emblem 可以做的范围,因为它是 Ember+Handlebars 的固有限制。您要做的是使用input助手,并在助手调用中使用另一个助手t来获取placeholder选项的值。您不能(目前)在 Ember 中执行此操作,因此 Emblem 将无法为您执行此操作。

编辑:您应该尝试Ember i18n库。我还没有使用它,但看起来你想要做的是将 TranslateableAttributes mixin 混合到 Ember.View 中,例如:

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

然后在你的标志模板中你可以做类似的事情

= input placeholderTranslation="button.add_user.title"
于 2013-07-22T16:07:30.877 回答
1

我注意到第一个错字placeholder="#{t 'users.attributes.username}"。它缺少结束单引号。

Emblem syntax error, line 2: Expected BeginStatement or DEDENT but "\uEFEF" found.可能具有误导性。我发现该错误完全与所报告的内容不同。例如,linkTo没有|for 纯文本会报告类似的错误。

于 2013-07-21T05:31:30.157 回答
0

您应该使用视图来格式化事物并将它们放入模板中。控制器并不意味着知道模板上发生了什么。

您还希望它成为一个属性,因此 i18n 将只工作一次,然后您就可以使用缓存版本。

模板:

{{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()

});
于 2015-05-02T06:58:14.717 回答