我想要暴露给类的大多数/所有实例的属性和方法(即除少数路径,控制器之外的所有实例)。似乎有多种方法可以实现这一目标,我在这里寻找最佳实践的指导。
更具体地说,我在应用程序控制器上创建了一个属性来保存用户会话对象。我希望所有其他控制器公开这些数据,就好像我输入了一样:
needs: ['application'],
userSession: Ember.computed.alias('controllers.application.userSession')
直接进入控制器。
此外,我想覆盖beforeModel的所有路由(除了登录路由,可能还有更多)以检查userSession是否存在,如果不存在则重定向到登录路由。
这是在ember-cli FYI中实施的。那么,就是这样,"对"是什么?接近这里?我是否尝试通过初始化程序/服务注入这些更改?我是否创建了混合来完成这些工作(我不是每次有人在做这件事时都要记住这样做的粉丝,他们必须记住添加mixin)。
答案 0 :(得分:2)
听起来非常像使用initializer
和一个service
是最好的方法(它们被拆分成为更清晰的代码)。 initializer
只是加载service
的代码,服务会付出艰苦的努力。 initializer
应该类似于:
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
从应用程序移动到服务。
我的身份验证服务太大了(在我的情况下:太具体了,因为它使用Firebase)在这里引用它。昨天我在答案中给出了它的要点:Short delay when trying to run redirect with ember route with firebase authentication
正如你所提到的那样:人们不必严格记住包含mixins,因为你可以覆盖有人ember generate
时使用的蓝图:http://www.ember-cli.com/#generators-and-blueprints