【问题标题】:How to use i18n in a custom attribute on Aurelia?如何在 Aurelia 的自定义属性中使用 i18n?
【发布时间】:2018-04-21 02:24:41
【问题描述】:

我在 Aurelia 中有以下自定义属性:

import { fireEvent } from '_utils/events'
import { autoinject, customAttribute, inject } from 'aurelia-framework'
import $ from 'jquery'
import { I18N } from 'aurelia-i18n'
import 'Modernizr'
import 'pickadate/lib/compressed/picker'
import 'pickadate/lib/compressed/picker.date'

@customAttribute('datepicker')
@inject(Element)
@autoinject
export class DatePicker {
  // public i18N: I18N
  private usePickADate: boolean

  constructor (private element: Element, private i18n: I18N) {
    this.i18n = i18n
    this.usePickADate = !Modernizr.inputtypes.date
    $(this.element).pickadate({
      weekdaysShort: ['Ss', 'Mm', 'Tt', 'Ww', 'Th', 'Ff', 'Ss'],
      showMonthsShort: true,
      format: i18n.tr('general.date-format')
    })
  }

  public attached () {
    if (this.usePickADate) {
      $(this.element).pickadate()
        .on('change', (e: any) => {
          fireEvent(e.target, 'input')
        })
    }
  }

  public detached () {
    if (this.usePickADate) {
      $(this.element).pickadate('picker')
        .off('change')
        .stop()
    }
  }
}

这里我无法使用 i18n 进行翻译和本地化。我收到此错误:

内部错误:消息:无法读取未定义的属性“tr”

有什么问题?我该如何解决?

【问题讨论】:

    标签: typescript localization aurelia i18next custom-attribute


    【解决方案1】:

    您可以通过两种方式在 Aurelia 中注入依赖项,使用 @autoinject() 或使用 @inject()

    • @autoinject() 自动查看任何构造函数参数并自动注入您导入的任何依赖项。

    • @inject() 要求您特别提及您希望注入到类中的任何依赖项。

    使用@autoinject() 的简单案例是:

    import { I18N } from "aurelia-i18n";
    import { autoinject } from "aurelia-framework";
    
    @autoinject()
    export class DatePicker {
    
      constructor (private element: Element, private i18n: I18N) { }
    
    }
    

    如果您出于任何原因确实希望使用@inject() 而不是@autoinject(),请务必注入所有依赖项,如下所示:

    import { I18N } from "aurelia-i18n";
    import { inject } from "aurelia-framework";
    
    @inject(Element, I18N)
    export class DatePicker {
    
      constructor (private element: Element, private i18n: I18N) { }
    
    }
    

    你在你的问题中同时使用了这两个,这似乎把事情搞砸了。

    【讨论】:

    • 非常感谢。这十分完美。不幸的是,在我设置 datePicker up 后,绑定不起作用。我在输入中看到了新日期,但它没有绑定到视图模型中的“currentDate”。你有什么解决这个问题的办法。我使用以下代码在模型中使用 datePicker:
    • 我需要更多代码,如果您自己找不到问题,可能会提出一个新问题,但请先尝试自己找到答案。
    【解决方案2】:

    我解决了,我删除了@inject(Element)

    import { autoinject, customAttribute } from 'aurelia-framework'
    ....
    @customAttribute('datepicker')
    @autoinject
    export class DatePicker {
    ....
    

    【讨论】:

    • 如果您确实需要使用inject 而不是autoinject,请记住将所有依赖项添加到inject() 装饰器中。
    • 我该怎么做?我想注入元素。你能给我一个示例代码吗
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    • 2016-06-10
    • 2018-03-01
    • 1970-01-01
    相关资源
    最近更新 更多