ember.js 在承诺兑现后,如何为帮助者注入服务?

gab6jxml  于 2022-11-05  发布在  其他
关注(0)|答案(2)|浏览(168)

我正在开发一个简单的Ember应用程序,它从API中检索所有语言字符串。我已经用translate()方法设置了一个服务,并将该服务注入到一个助手中。问题是,我想使用的属性在助手中不可用,因为当它被使用时,承诺还没有实现。在从服务加载属性后,我如何在助手中访问该属性?
服务(应用程序/服务/i18n.js):

export default Ember.Service.extend({
    locales: null,
    init() {
        this._super();

        Ember.$.getJSON('/api/recruiting/locales').then(function (response) {
            this.set('locales', response.data);
        }.bind(this));
    },
    translate(key) {
        // This causes the problem: locales property has not been loaded yet at this point
        return this.get('locales.' + key);
    }
});

帮助程序(app/helpers/translate.js):

export default Ember.Helper.extend({
    i18n: Ember.inject.service(),
    compute(params/*, hash*/) {
        var i18n = this.get('i18n');

        return i18n.translate(params[0]);
    }
});
x7yiwoj4

x7yiwoj41#

我刚找到一个“解决方案”。每次“locales”属性更改时,我都会重新计算助手。下面是助手的外观:

export default Ember.Helper.extend({
    i18n: Ember.inject.service(),
    onLocalesInit: Ember.observer('i18n.locales', function () {
        this.recompute();
    }),
    compute(params/*, hash*/) {
        var i18n = this.get('i18n');

        return i18n.translate(params[0]);
    }
});
z6psavjg

z6psavjg2#

注意观察器被认为是不好的做法,所以你需要在i18n服务中实现某种类型的更改监听器来触发i18n.locales变量中的更改。

import Helper from '@ember/component/helper';
import { inject as service } from "@ember/service";

export default class Translate extends Helper {
  @service i18n;

  init() {
    super.init(...arguments);
    this.i18n.addChangeListener(this.localeChanged);
  }

  willDestroy() {
    super.willDestroy();
    this.i18n.removeChangeListener(this.localeChanged);
  }

  localeChanged = () => {
    this.recompute();
  }

  compute([key]) {
    return this.i18n.translate(key);
  }
}

相关问题