在Aurelia

时间:2015-11-03 00:43:17

标签: javascript aurelia

如果我,例如。在我的标题中使用选择下拉输入字段(更准确地说,在我的站点范围导航栏中是自定义元素),并在共享状态对象中全局设置该值。如果我 - languageChanged(value)(在导航栏自定义元素内)也更改了this.i18n.setLocale('de-DE')

如何在我的模板中刷新i18n翻译的字符串插值(例如${'status_deceased' | t}),而不必像我现在那样导航到新路线并返回?

我在github上发现了关于问题https://github.com/aurelia/i18n/issues/6的问题,但由于我需要这个工作,我希望存在一些聪明的解决方法,除了必须使用window.location重新加载页面:/ < / p>

修改

如果我正确地理解这一点似乎可能只是我的幸运日,并且这样的功能刚刚在8天前添加,虽然仍然没有记录:https://github.com/aurelia/templating-resources/pull/126 - 任何人都可以找出并告诉我如何实现这个,或许使用这个新功能?如果我自己解决这个问题,我会用解决方案更新这个帖子: - )

1 个答案:

答案 0 :(得分:3)

当下一个版本发布时,您将能够使用signal绑定行为为绑定分配“信号名称”,如下所示:

<h1>${'title_key' | t & signal:'i18n'}</h1>
<p>${'content_key' | t & signal:'i18n'}</p>

&符号表示“绑定行为”(与值转换器的|相对)。绑定行为是为绑定添加“行为”的资源。他们拥有对绑定实例的完全访问权限,并在绑定的bindunbind生命周期事件之前得到通知。

Aurelia将提供多种内置绑定行为:“油门”,“去抖动”,“一次性”,“信号”等。您还可以选择创建自己的绑定行为。

在上面的示例中,我们为titlecontent插值绑定提供了“信号”名称“i18n”。这个名字是任意的,我们只需要知道它是什么,所以我们可以使用BindingSignaler像这样“发信号”修饰绑定:

import {BindingSignaler} from 'aurelia-templating-resources';
import {inject} from 'aurelia-framework';

@inject(BindingSignaler)
export class App {
  constructor(signaler) {
    this.signaler = signaler;
  }

  // invoking this method will refresh all bindings in the application
  // with the "signal name" of "i18n"
  refreshBindings() {
    this.signaler.signal('i18n');
  }
}

我想,一旦绑定行为功能下降,i18n插件中将有额外的工作将t值转换器与某些版本的signal绑定行为结合起来,以启用简洁的绑定表达式当语言发生变化时翻译和刷新绑定,以便你可能暂时保持紧张。

修改 如果您今天需要一些东西,您可以利用现有的Aurelia功能:当转换器参数发生变化时,绑定将被重新评估

  1. 创建一个新类:
  2. export class LanguageChangedNotifier {
      signal = 0;
    
      notify() {
        this.signal++;
      }
    }
    
    1. 将此类注入所有视图模型,并将该实例添加为属性:
    2. @inject(LanguageChangedNotifier)
      export class App {
        constructor(notifier) {
          this.notifier = notifier;
        }
      }
      
      1. t绑定中使用通知程序(它不会影响t值转换器的行为):
      2. ${'status_deceased' | t:notifier.signal}
        
        1. 更改语言环境时,请使用通知程序刷新绑定:
        2. this.notifier.notify();