You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

能否在函数中获取Aurelia I18N实例?无需使用@inject?

当然可以!在Aurelia里,哪怕不用@inject装饰器,也有几种靠谱的方式能拿到I18N实例,下面给你分享几个实用的例子:

方法一:通过Aurelia全局容器获取

如果你的代码在Aurelia应用启动后的上下文里,可以直接通过应用实例的容器来获取I18N。比如在项目的启动文件(通常是main.ts)里:

import { Aurelia } from 'aurelia-framework';
import { I18N } from 'aurelia-i18n';

export async function configure(aurelia: Aurelia) {
  aurelia.use
    .standardConfiguration()
    .plugin('aurelia-i18n', (instance) => {
      // 先完成I18N的基础配置
      instance.setup({
        resources: {
          // 这里填你的语言资源路径或配置
        },
        lng: 'en',
        fallbackLng: 'en'
      });
    });

  await aurelia.start();
  aurelia.setRoot('app');

  // 在这里直接从容器resolve I18N实例
  const i18n = aurelia.container.get(I18N);
  console.log(i18n.tr('hello')); // 测试翻译功能
}
方法二:在组件中通过this.container获取

如果你的组件类是由Aurelia负责实例化的(比如自定义元素、页面视图模型这些),哪怕你没给类注入任何依赖,也能直接访问实例上的this.container属性,再通过它获取I18N:

import { I18N } from 'aurelia-i18n';

export class MyProfileComponent {
  handleButtonClick() {
    // 直接从组件的容器中获取I18N
    const i18n = this.container.get(I18N);
    const greeting = i18n.tr('profile.greeting');
    alert(greeting);
  }
}

小提示:这种方式只对Aurelia管理的类生效,因为框架会自动把容器挂载到实例的container属性上。

方法三:全局挂载I18N实例(应急用,不推荐)

如果你需要在完全脱离Aurelia管理的普通函数里用I18N,可以在启动时把实例挂载到window全局对象上:

// 在main.ts的configure函数中
aurelia.use
  .plugin('aurelia-i18n', async (instance) => {
    await instance.setup({
      // 你的I18N配置
    });
    // 挂载到window全局
    (window as any).globalI18n = instance;
  });

之后在任意普通函数里就能直接用了:

function utilityFunction() {
  const i18n = (window as any).globalI18n;
  console.log(i18n.tr('utility.message'));
}

注意:这种方式会污染全局命名空间,大型项目里尽量别用,优先选择前两种依赖容器的方式,更符合Aurelia的设计理念。

内容的提问来源于stack exchange,提问作者Efim Vl. Dejin

火山引擎 最新活动