Ember Octane 如何转换自定义 mixins

Ember Octane How to convert custom mixins

此问题与: Mixins 在 Ember Octane 中正式弃用。

问题:

替换 Ember 混入的最佳选择是什么?我该如何实现它?

上下文:

我有自定义 mixin,可以扩展 ember-simple-auth (~v1.8.2) 提供的功能,在创建方法时不可用(见下文)。我目前正在使用 ember-simple-auth 3.0.0 https://github.com/simplabs/ember-simple-auth。在 github 的文档中,他们似乎在 Ember Octane 上使用自己的 mixin,如您所见:

// my-engine/addon/routes/index.js
import Route from '@ember/routing/route';
import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin';

export default class IndexRoute extends Route.extend(AuthenticatedRouteMixin) {
  triggerAuthentication() {
    this.transitionToExternal('login');
  }
}

看来我不是唯一遇到此问题的人,因为 Simple Auth 也不知道他们想要走哪条路线:https://github.com/simplabs/ember-simple-auth/issues/2185

选项:

我有以下身份验证混合:

  1. Application Route: 这处理用户是否登录以及用户是否启用双因素身份验证(2FA),如果启用,它验证用户已通过 2FA 验证。这是因为简单身份验证在开发 mixin 时没有提供 2FA
  2. 经过身份验证的路由: 确保用户已登录。如果他们未登录,则用户将被路由到登录页面。一旦他们登录,他们将被路由回他们最初尝试去的页面
  3. UnAuthenticated Route: 防止登录用户进入某些登录用户不应进入的路由

首先,我想非常清楚地表明 Ember 中的混入不是 "officially deprecated",据我所知,甚至没有 active RFC about it. As the Upgrade Guides 解释,Glimmer 组件不支持混入,因为不扩展 EmberObject,但预先存在的框架 类(路由、控制器等)必然必须扩展,否则将是一个重大变化。

没有替换 mixins 的最佳选择,因为它取决于 API 的用法。如果你问如何替换 ember-simple-auth mixins,我的回答是你不能,直到插件本身提供替代 APIs。 Mixins 和您发布的示例代码将在可预见的未来继续工作。
您可以看到 using class inheritance to share functionality in this PR.

的示例

当我迁移到 ember Octane 时,我试图替换 ember-simple-auth mixins,我发现这比重写我自己的身份验证服务要花费我很多时间,我在这玩意儿,我在用 cookies,Auth service 如果您不使用 cookie,您可以自定义您的适配器以在 headers

中包含一个令牌

我在 Git 上与 ESA 打交道,我在 OP 中引用的同一个问题已被关闭,新问题随后被合并:

https://github.com/simplabs/ember-simple-auth/pull/2198

ESA 现在更新了他们的库以摆脱路由混合。