Ember.js 余烬cli&;常见路由和控制器行为选项:子类、Mixin或初始值设定项(服务)?

Ember.js 余烬cli&;常见路由和控制器行为选项:子类、Mixin或初始值设定项(服务)?,ember.js,ember-cli,Ember.js,Ember Cli,我希望将属性和方法公开给类的大多数/所有实例(即除了少数路由、控制器以外的所有实例)。似乎有多种方法可以实现这一点,我在这里寻找最佳实践的指导 更具体地说,我在应用程序控制器上创建了一个属性来保存用户会话对象。我希望所有其他控制器公开此数据,就像我键入: needs: ['application'], userSession: Ember.computed.alias('controllers.application.userSession') 直接进入控制器 此外,我希望覆盖beforeMo

我希望将属性和方法公开给类的大多数/所有实例(即除了少数路由、控制器以外的所有实例)。似乎有多种方法可以实现这一点,我在这里寻找最佳实践的指导

更具体地说,我在应用程序控制器上创建了一个属性来保存用户会话对象。我希望所有其他控制器公开此数据,就像我键入:

needs: ['application'],
userSession: Ember.computed.alias('controllers.application.userSession')
直接进入控制器

此外,我希望覆盖beforeModel的所有路由(除了登录路由,可能还有更多)实现,以检查是否存在userSession,如果没有,则重定向到登录路由


这将在ember cli供参考中实施。那么,既然如此,“正确”的方法是什么?我是否尝试通过初始值设定项/服务注入这些更改?我是否创建了混入来做这件事(我不喜欢每次有人做这件事时都要记得这样做,然后他们必须记得添加混入)。

听起来很像使用
初始值设定项,而
服务是最好的方法(将它们分开会使代码更干净。
初始值设定项
只是加载
服务的代码
,该服务会完成繁重的工作。
初始值设定项
应该类似于:

import AuthService from '../services/auth';

export default {
  name: 'auth-service',
  initialize: function( container, app ) {
    app.register( 'service:auth', AuthService, { singleton: true } );
    app.inject( 'controller', 'auth', 'service:auth' );
    app.inject( 'route', 'auth', 'service:auth' );
  }
};
然后将
auth
注入每个控制器和路由,您应该将
userSession
从应用程序移动到服务

我的auth服务太大(在我的例子中:太具体了,因为它使用Firebase)无法在这里引用。我昨天在回答中给出了它的要点:


正如你提到的:人们不需要严格记住包含混入,因为你可以覆盖当有人生成
ember
时使用的蓝图:

我想知道,如果我选择混入路线,是否可以蒙骗蓝图。在办公室里讨论这个问题,我们倾向于你提出的解决方案n但我不确定这是否是惯用的“余烬”方式。如果一切顺利,我将尝试并标记为回答。你确实说过(我发现自己也处在同一个位置)您在大多数路线/管制员中都需要授权服务。这本身就是一个提示,您应该注入授权服务,而不是
需要
-注入管制员。如果您只在少数管制员中需要授权服务,那么在这些管制员中注入授权服务可能仍然是最干净的解决方案,而且样本最少,尽管没有不一定很明显,它是从控制器本身的pov注入的。当我实现它时,我想到它只解决了我问题的一半。这将移动“会话”将信息注入到注入的属性中,但在某些情况下不处理路由的主要默认行为,以覆盖beforeModel钩子重定向到登录。或者,您是否建议将该部分混入?我不清楚如何注入该行为……这本身更值得一提。您必须做好准备,用户可以始终使用浏览器的开发工具来访问受保护的页面。换句话说,根据Firebase端的实际身份验证状态限制对数据的读取访问。要在路由器级别上处理此问题,此答案可能会有所帮助:在我的情况下,如果他们胡闹以获得对路由的访问权,则安全性并不重要ey不应该这样做,因为如果auth服务中没有会话数据,那么后端的任何服务都不会工作(即数据受到保护)。这实际上只是一种用户体验。我最终做的是创建一个“AuthenicatedLote”这实现了一个我想要的beforeModel钩子。然后我创建了一个新的蓝图,这样当我执行ember g route时,默认情况下它会自动扩展我的AuthenicateDurote。看起来工作正常。