gpt4 book ai didi

ember.js - 如何在没有类型注入(inject)的情况下在应用启动时初始化 Ember 服务?

转载 作者:行者123 更新时间:2023-12-04 14:09:53 29 4
gpt4 key购买 nike

也许这有点深奥,但我需要一些帮助。

我的用例是时钟自动收报机。我想要一项服务,在 init() 上将启动一个计时器。 (例如 AJAX 轮询服务)。我希望它在应用程序启动时开始,但我不希望将它注入(inject)到每个对象类型中。

我试过的:

  • 编写服务并使用 Ember.inject.service()在应用程序 Controller 中。
  • 使用带有 app.register(…, MyService.create(), {instantiate: false}) 的初始化程序无需调用 app.inject(…) .
  • 不要在 init() 中启动计时器而是 Ember.inject.service()它进入应用程序路由/ Controller 及其init()调用this.get('myService').startTimer() .

  • 以下是我遇到的一些绊脚石:
  • 服务是延迟加载的,因此计时器永远不会启动,因为应用程序 Controller 从未执行 this.get('myService') .我可以在 Controller 的 init() 中做到这一点但这感觉就像是代码的味道。
  • 似乎 Ember 解析器会看到 services/my-service.js文件并自动注册。执行 app.register()似乎注册了两个实例,这两个实例感到困惑。
  • 就像在应用程序 Controller 的 init() 中获取惰性服务一样这个解决方案也感觉像代码味道。但在我尝试过的所有解决方案中,这是可行的,并且是三者中最不臭的。

  • 还有其他选择吗?

    最佳答案

    TL;DR 使用实例初始化器

    实例初始化程序将具有所需的查找函数来获取系统自动注册的服务并对其执行操作。

    但是,为路由或 Controller 的 init() 保存此初始化可能更合适。因为这里的任何 ajax 之类的东西仍然会属于 Embers 加载状态和运行循环。在实例初始化程序中执行时会降低启动性能而没有实际好处。

    如果你仍然觉得初始化器是可行的方法,这里是一个人为的例子,它与 Ember 1.13 和 2.0 兼容:

    // app/instance-initializers/start-my-service.js
    export function initialize(app) {
    const { container = app } = app;
    const myService = container.lookup('service:my-service');
    myService.startPolling();
    }

    export default {
    initialize
    };

    一个 example ember-twiddle .

    关于ember.js - 如何在没有类型注入(inject)的情况下在应用启动时初始化 Ember 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38341428/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com